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

在这两种情况下,我都看到了以下问题。在控制台中,如果我像这样实例化一个 foofoo = 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

希望对您有所帮助。