problem: validation error is not functionning in callback callback for many-to-many association: # keyword.rb :before_add => :reject_self_related def reject_self_related(related_keyword) if (related_keyword == self) # this does not work: errors.add(:name, "Relating a keyword to itself is forbidden!") raise "Relating a keyword to itself is forbidden!" end end in the keyword.rhtml form: <%= error_messages_for ''keyword'' %> does not display the error message. what am I doing wrong? -- Posted via http://www.ruby-forum.com/.
Isabelle wrote: Hi Isabelle, First off, is the callback being triggered at all ? If you replace the whole body with the raise, do you see the exception ? Second, if you just replace the body with the errors.add, do you see the error ? Last, == on Object tests for the exact same Object, I think ActiveRecord override this to compare ids, if the new item hasn''t yet been saved, the == method will return false. Perhaps you need to check, say keyword.text, or whatever the property is that stores the text. Alan -- Posted via http://www.ruby-forum.com/.
Alan Francis wrote:> Isabelle wrote: > > Hi Isabelle, > > First off, is the callback being triggered at all ? If you replace the > whole body with the raise, do you see the exception ?yes. I can catch the exception in the controller and display the exception message: # keywords_controller.rb # attempt to add item to list begin @keyword.related_keywords<< @related rescue Exception # extract error messages from the global variable # representing the Exception object flash[:notice] = $!.message end> Second, if you just replace the body with the errors.add, do you see the > error ?no, and the object that should not have been saved is saved.> Last, == on Object tests for the exact same Object, I think ActiveRecord > override this to compare ids, if the new item hasn''t yet been saved, the > == method will return false. Perhaps you need to check, say > keyword.text, or whatever the property is that stores the text.I see your point. In my case the callback is before adding an existing item to a collection that is defined as a self-referential has_and_belongs_to_many relation. -- Posted via http://www.ruby-forum.com/.
> I see your point. In my case the callback is before adding an existing > item to a collection that is defined as a self-referential > has_and_belongs_to_many relation.I''d reckon that''s the problem then, and would compare the attribute, rather than the object. -- Posted via http://www.ruby-forum.com/.
Alan Francis wrote:> >> I see your point. In my case the callback is before adding an existing >> item to a collection that is defined as a self-referential >> has_and_belongs_to_many relation. > > I''d reckon that''s the problem then, and would compare the attribute, > rather than the object.tried it and still the errors.add() is not executed -- Posted via http://www.ruby-forum.com/.