オブジェクトを保存するときに実行したいフィールドの更新があります。この更新は、オブジェクトが検証されているかどうかに関係なく行われる必要があり、検証の前に行われる必要があります。
問題は、検証なしで保存すると、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
そして今、あなたは素晴らしいボーナスとして常にコールバックを適切に使うことができます。