保存对象时,我希望更新一个字段。无论对象是否经过验证,此更新都必须发生,并且必须在验证之前发生。
问题是在没有验证的情况下保存时 before_validation 不会运行。这段代码应该放在哪里?有没有办法在没有验证的情况下保存时调用 before_validation 回调?
谢谢!
保存对象时,我希望更新一个字段。无论对象是否经过验证,此更新都必须发生,并且必须在验证之前发生。
问题是在没有验证的情况下保存时 before_validation 不会运行。这段代码应该放在哪里?有没有办法在没有验证的情况下保存时调用 before_validation 回调?
谢谢!
不,根据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
一直正确地使用回调作为一个不错的奖励。