10

ご存知のように、before_saveコールバックはコールバックの前に実行されbefore_createます。

したがって、他のコールバック(自動保存コールバックなど)に関連してコールバックメソッドが適切なタイミングで実行されるようにするbefore_save :method, :on => :create代わりに、inを使用する方がよいと提案する人もいます。before_createたとえば、このPivotalLabsのブログ投稿このStackOverflowの回答を参照してください。

しかし、私が知る限り、この:on => :createオプションはコールバックに対して望ましい効果を達成していませんbefore_save。つまり、作成かどうかに関係なく、保存ごとにコールバックが実行されます。

ただし、この:on => :createオプションbefore_validationコールバックには有効であるように見えます。

誰かがのため:on => :createに働くことになっているのかどうかを確認できbefore_saveますか?以前のバージョンのRailsで機能し、現在は壊れていますか、それとも前述のリンクは単に間違っていますか?

が有効でないと仮定すると:on => :create、次のことが許容されますか、および/またはより良い方法がありますか?

before_save :callback_method, :if => :new_record?

ありがとうございました。

4

1 に答える 1

19

そうです、コールバックの:onオプションはありません。before_saveしかし、私にはわかりません。なぜbefore_saveの代わりに使用するのですかbefore_createbefore_createコールバックはの直後に呼び出されますbefore_save

もちろん、を使用することができますbefore_save :callback_method, :if => :new_record?。しかし、私は個人的にこのソリューションが好きではありません-:ifオプションに条件を追加する必要がある場合はどうなりますか?

before_saveとコールバックの間に依存関係がある場合はbefore_create、2つのコールバックを組み合わせるように提案します。たとえば(擬似コード):

class MyModel < ActiveRecord::Base
  before_create :prepare_x
  before_save :do_something_with_x

  def prepare_x
    @x = 10
  end


  # will not work, because `prepare_x` called after `do_something_with_x`
  def do_something_with_x
    @a = 100 / @x
  end
end

# ||
# ||
# \/

class MyModel < ActiveRecord::Base

  before_save :do_something_with_x

  def do_something_with_x
    @x = 10 if new_record?
    @a = 100 / @x
  end
end
于 2012-05-17T17:56:20.140 に答える