0

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

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

谢谢!

4

1 回答 1

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一直正确地使用回调作为一个不错的奖励。

于 2012-07-26T08:48:58.243 回答