Rails 2.3.8:在保存之前验证对象显示以前的引用而不是更新的引用

时间:2011-06-21 08:24:35

标签: ruby-on-rails validation associations

我的网站上有一个表单允许更新对象(即Book)。 该书包含引用Author类的字段author_id。 表单允许更改作者。

保存图书时,会运行验证, 但是当某个验证调用self.author时,它将接收前一个作者而不是所选择的新作者。 为了解决这个问题,我总是必须通过以下方式重新加载新作者来启动验证:

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

为什么验证不会看到新作者,我怎样才能看到它, 无需每次都重新加载新引用的对象?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是您可以在控制台中复制的问题:

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...>

所以...更改关联ID(这是表单update_attributes所做的)不会更改加载的关联对象。

但是,如果首先使对象无效,则关联对象会重新加载:

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

所以你可以(注意斜体,因为我不知道什么是最佳解决方案)如果关联id是,则在控制器中将对象设置为nil在params哈希中,或继续使用你的方法,但添加一个后卫只在必要时重新加载

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

(对不起,如果那是漫不经常的,基本上没有回答你的问题; - )