我正在使用Rails 4.0.0。我有以下设置:
class Foo < ApplicationController
before_validation :foo, on: :create
...
private
def bar
puts 'bar is called'
end
end
这是有效的 - 在控制台中,当我创建foo
时,我看到消息'bar被调用'。如果我在valid?
上调用foo
,则不会调用该消息(正确行为)。
现在我想在update
上添加此回调。我尝试了两件事:
before_validation :foo, on: [:create, :update]
和
before_validation :foo, on: :create
before_validation :foo, on: :update
在这两种情况下,我都会看到以下问题。在控制台中,如果我像foo
那样实例化foo = Foo.last
然后调用foo.valid?
,我会看到bar
已触发,但我没有更新foo
}。我希望它只能在foo.update(...)
之后调用。我做错了什么或这是预期的行为?
答案 0 :(得分:1)
由于您要foo
将{strong>旧记录分配到foo = Foo.last
,因此在针对:update
运行验证时,将foo
作为上下文。其中,on: :create
验证仅针对新记录进行检查。
如果您研究valid?
方法实现,将会很清楚:
def valid?(context = nil)
context ||= (new_record? ? :create : :update)
output = super(context)
errors.empty? && output
end
希望这有帮助。