Rails 2.3.14:在没有验证的情况下保存时不运行before_validation

时间:2012-07-26 08:30:51

标签: ruby-on-rails ruby callback

保存对象时,我希望更新某个字段。 无论对象是否经过验证,都必须进行此更新, 并且必须在验证之前发生。

问题是在没有验证的情况下保存时,before_validation不会运行。 这段代码应该放在哪里? 有没有办法在保存时调用before_validation回调而不验证?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,根据http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

你正在解决这个问题,因为你很顽皮,没有验证你就是在攒钱。不要那么做。 认真。相反,你应该放松你的验证策略,这样所有这些“保存而无需验证”的废话就变成了“通过验证保存”。

为此,您可以将一些选项传递给验证方法,或者在自定义validate方法中使用一些条件子句。

class User < ActiveRecord::Base
  before_validation :my_crazy_thing      
  validates_presence_of :name, :unless => :is_a_robot?

  def is_a_robot?
    @brain_type == :positronic
  end

  def my_crazy_thing
    @brain_type = brain_surgery.brain_type
    # or whatever
  end

  def validate
    if condition_exists_to_run_custom_validations
      errors.add_to_base 'WTF' if @universe.exploded?
    end
  end
end

因此,在此之前,您必须跳过验证,以便机器人可以在没有名称的情况下存在。但是,如果您正确设置验证,那么您永远不需要在没有它们的情况下进行保存您可以告诉您已正确设置它们,因为您不必在不进行验证的情况下进行保存。现在你可以一直正确地使用before_validation回调作为一个很好的奖励。