Reputation: 5497
In my model Shop
I'm saving image url in logo_ori
and use that to make thumbnails using before_update
.
# shop.rb
before_update :run_blitline_job
private
def run_blitline_job
# uses logo_ori to make thumbnails
end
However I found out that when I'm saving other attributes (eg: editing shop's profile in a form) it also runs before_update
. How do I confine its execution when only logo_ori
is saved?
I've tried this :
before_update :run_blitline_job, :if => :logo_ori?
but it still runs before_update
if I already have logo_ori
saved earlier.
Upvotes: 18
Views: 29776
Reputation: 2488
before_update :run_blitline_job, :if => :logo_ori_changed?
This will run the callback every time the logo_ori
attribute changes. You can also use strings to implement multiple conditionals:
before_update :run_blitline_job, :if => proc { !logo_ori_was && logo_ori_changed? }
Upvotes: 39
Reputation: 2385
its simple you can use ActiveModel::Dirty (checkout the documentation), it is available in all models in rails 3
before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }
Upvotes: 0
Reputation: 17647
You are close, you want something like this:
before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }
sources:
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
Upvotes: 4