Before_validation:foo,on :: update不按预期工作

时间:2015-03-11 08:28:39

标签: ruby-on-rails activerecord callback object-lifetime

我正在使用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(...)之后调用。我做错了什么或这是预期的行为?

1 个答案:

答案 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

希望这有帮助。