save and validation support for associations.
a simple (manual) unsaved? flag and method. at least it automatically reverts after a save!
the ever-useful #to_label method
# File lib/active_scaffold/extensions/unsaved_associated.rb, line 3 def associated_valid?(path = []) return true if path.include?(self) # prevent recursion (if associated and parent are new records) path << self # using [].all? syntax to avoid a short-circuit with_unsaved_associated { |a| [a.valid?, a.associated_valid?(path)].all? {|v| v == true} } end
# File lib/active_scaffold/extensions/unsaved_associated.rb, line 18 def no_errors_in_associated? with_unsaved_associated {|a| a.errors.count == 0 and a.no_errors_in_associated?} end
# File lib/active_scaffold/extensions/unsaved_associated.rb, line 10 def save_associated with_unsaved_associated { |a| a.save and a.save_associated } end
# File lib/active_scaffold/extensions/unsaved_associated.rb, line 14 def save_associated! save_associated or raise(ActiveRecord::RecordNotSaved) end
automatically unsets the unsaved flag
# File lib/active_scaffold/extensions/unsaved_record.rb, line 14 def save_with_unsaved_flag(*args) result = save_without_unsaved_flag(*args) self.unsaved = false return result end
# File lib/active_scaffold/extensions/to_label.rb, line 3 def to_label [:name, :label, :title, :to_s].each do |attribute| return send(attribute).to_s if respond_to?(attribute) end end
acts like a dirty? flag, manually thrown during update_record_from_params.
# File lib/active_scaffold/extensions/unsaved_record.rb, line 4 def unsaved=(val) @unsaved = (val) ? true : false end
whether the unsaved? flag has been thrown
# File lib/active_scaffold/extensions/unsaved_record.rb, line 9 def unsaved? @unsaved end
Provide an override to allow the model to restrict which associations are considered by ActiveScaffolds update mechanism. This allows the model to restrict things like Acts-As-Versioned versions associations being traversed.
By defining the method :scaffold_update_nofollow returning an array of associations these associations will not be traversed. By defining the method :scaffold_update_follow returning an array of associations, only those associations will be traversed.
Otherwise the default behaviour of traversing all associations will be preserved.
# File lib/active_scaffold/extensions/unsaved_associated.rb, line 34 def associations_for_update if self.respond_to?( :scaffold_update_nofollow ) self.class.reflect_on_all_associations.reject { |association| self.scaffold_update_nofollow.include?( association.name ) } elsif self.respond_to?( :scaffold_update_follow ) self.class.reflect_on_all_associations.select { |association| self.scaffold_update_follow.include?( association.name ) } else self.class.reflect_on_all_associations end end