8

before_save3 つのフィールド (street、city、state) のいずれか (必ずしもすべてではない) に変更があった場合にのみ実行されるコールバックを作成したいと考えています。これどうやってやるの?ありがとう

user.rb

class User
  before_save :run_test_method, :if => street_changed?

  ...
end
4

3 に答える 3

14

オプション 1

次のようなメソッドを作成できます。

def ok_to_run_test_method?
  street_changed? || something_changed? || something_else_changed?
end

そして、次を使用します。

before_save :run_test_method, :if => :ok_to_run_test_method?

:ok_to_run_test_method?が記号であることに注意してください。タイプミスかどうかはわかりませんが、質問では実際にクラスメソッドを呼び出していますstreet_changed?

オプション 2

コールバックを少し近代化し、ブロック スタイルの構文を使用します。

before_save do
  if street_changed? || something_changed? || something_else_changed?
    # whatever you currently have in #run_test_method
  end
end
于 2012-10-15T03:28:21.217 に答える
11

を使用して1行で実行できますProc

class User
  before_save :run_test_method, :if => Proc.new { |u| u.street_changed? || u.city_changed? || u.state_changed? }

  ...
end
于 2012-10-15T03:29:58.817 に答える