开发者

Rails 2.3.8: Validating an object before save shows previous references and not updated ones

There's a form on my site allowing to update an object (i.e. Book). The book contains the field author_id which references the Author class. The form allows changing the author.

When saving the book, validations are run, but when a certain validation calls self.author, it will receive the previous author and not the new one that was chosen. To deal with this problem, I always have to start the validations with reloading the new author in the following way:

def some_validation
    author = Author.find(self.author_id)
    ...
 end

Why won't the validation see the new author, and how can I make it see it, without h开发者_如何学Pythonaving to reload the new referenced object every time?

Thanks!


This is a problem you can duplicate in the console:

b = Book.new
=> #<Book id:nil, etc...>
b.author_id = 1
=> 1
b.author
=> #<Author id:1, etc...>
b.author_id = 2
=> 2
b.author
=> #<Author id:1, etc...>

so... changing the association ID (which is what the form update_attributes does) doesn't change the loaded associated object.

but, if you nullify the object first, the associated object does reload:

b.author = nil
=> nil
b.author_id = 2
=> 2
b.author
=> #<Author id:2, etc...>

So you can (note the italics, because I don't know what is the best solution) set the object to nil in the controller if the association id is in the params hash, or continue using your method, but add a guard to only reload if necessary

author = Author.find(self.author_id) if self.author_id_changed?

(sorry if that was a lot of rambling that essentially didn't answer your question ;-)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜