Before_validation :foo, on: :update 没有按预期工作
Before_validation :foo, on: :update not working as expected
我正在使用 Rails 4.0.0。我有以下设置:
class Foo < ApplicationController
before_validation :foo, on: :create
...
private
def bar
puts 'bar is called'
end
end
这有效 - 在控制台中,当我创建 foo
时,我看到消息 'bar is called'。如果我在 foo
上调用 valid?
,则不会调用消息(正确行为)。
现在我想在 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(...)
之后被调用。我是做错了什么还是这是预期的行为?
由于您通过 foo = Foo.last
将 旧记录 分配给 foo
,它将以 :update
作为上下文,而 运行 针对 foo
的验证。其中,on: :create
验证仅针对 新记录.
检查
如果你研究一下valid?
方法的实现,就会一目了然:
def valid?(context = nil)
context ||= (new_record? ? :create : :update)
output = super(context)
errors.empty? && output
end
希望对您有所帮助。
我正在使用 Rails 4.0.0。我有以下设置:
class Foo < ApplicationController
before_validation :foo, on: :create
...
private
def bar
puts 'bar is called'
end
end
这有效 - 在控制台中,当我创建 foo
时,我看到消息 'bar is called'。如果我在 foo
上调用 valid?
,则不会调用消息(正确行为)。
现在我想在 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(...)
之后被调用。我是做错了什么还是这是预期的行为?
由于您通过 foo = Foo.last
将 旧记录 分配给 foo
,它将以 :update
作为上下文,而 运行 针对 foo
的验证。其中,on: :create
验证仅针对 新记录.
如果你研究一下valid?
方法的实现,就会一目了然:
def valid?(context = nil)
context ||= (new_record? ? :create : :update)
output = super(context)
errors.empty? && output
end
希望对您有所帮助。