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 に答える