在我的模型Shop
中,我将图片网址保存在logo_ori
中并使用该图片使用before_update
制作缩略图。
# shop.rb
before_update :run_blitline_job
private
def run_blitline_job
# uses logo_ori to make thumbnails
end
但是我发现当我保存其他属性时(例如:在表单中编辑商店的个人资料),它也会运行before_update
。仅在保存logo_ori
时如何限制其执行?
我试过这个:
before_update :run_blitline_job, :if => :logo_ori?
但如果我之前已经保存before_update
,它仍会运行logo_ori
。
答案 0 :(得分:31)
before_update :run_blitline_job, :if => :logo_ori_changed?
每次logo_ori
属性更改时,都会运行回调。您还可以使用字符串来实现多个条件:
before_update :run_blitline_job, :if => proc { !logo_ori_was && logo_ori_changed? }
答案 1 :(得分:3)
你很亲密,你想要这样的东西:
before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }
来源:
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
答案 2 :(得分:0)
它很简单,您可以使用ActiveModel::Dirty(查看文档),它可用于rails 3中的所有型号
before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }