【问题标题】:Before_validation :foo, on: :update not working as expectedBefore_validation :foo, on: :update 没有按预期工作
【发布时间】:2015-03-11 08:28:39
【问题描述】:

我使用的是 Rails 4.0.0。我有以下设置:

class Foo < ApplicationController

  before_validation :foo, on: :create

  ...

  private

    def bar
      puts 'bar is called'
    end
end

这有效 - 在控制台中,当我创建 foo 时,我看到消息“已调用栏”。如果我在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(...) 之后被调用。我做错了什么还是这是预期的行为?

【问题讨论】:

  • before_validation :foobefore_validation :bar ?

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


【解决方案1】:

由于您通过foo = Foo.last旧记录分配给foo,因此在针对foo 运行验证时,它将以:update 作为上下文。其中,on: :create 验证仅检查新记录

如果你研究valid?方法的实现,就会一目了然:

def valid?(context = nil)
  context ||= (new_record? ? :create : :update)
  output = super(context)
  errors.empty? && output
end

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    相关资源
    最近更新 更多