17

私のモデルでは、Shop画像のURLを保存し、それを使用して。logo_oriを使用してサムネイルを作成していbefore_updateます。

# shop.rb
before_update :run_blitline_job

private

def run_blitline_job
  # uses logo_ori to make thumbnails
end

ただし、他の属性を保存している場合(たとえば、フォームでショップのプロファイルを編集している場合)、それも実行されることがわかりましたbefore_updatelogo_ori保存された場合にのみ実行を制限するにはどうすればよいですか?

私はこれを試しました:

before_update :run_blitline_job, :if => :logo_ori?

ただし、以前に保存したことがbefore_updateある場合は、引き続き実行されます。logo_ori

4

3 に答える 3

39
before_update :run_blitline_job, :if => :logo_ori_changed?

logo_oriこれにより、属性が変更されるたびにコールバックが実行されます。文字列を使用して、複数の条件を実装することもできます。

before_update :run_blitline_job, :if => proc { !logo_ori_was && logo_ori_changed? }
于 2012-12-29T05:48:27.303 に答える
3

あなたは近くにいます、あなたはこのようなものが欲しいです:

before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }

ソース:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

于 2012-12-29T06:12:59.890 に答える
0

ActiveModel :: Dirty (ドキュメントをチェックアウト)を使用できるのは簡単で、 Rails3のすべてのモデルで利用できます。

before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }
于 2012-12-29T06:24:48.660 に答える