我无法使此before_save
过滤器正常工作。我认为我的方法很标准。图像通过Paperclip上传。
before_save :remove_checked_attachments
def attachments
%w(banner footer logo accreditation)
end
private
def remove_checked_attachments
attachments.each do |a|
if "remove_#{a}".to_sym && !"#{a}_updated_at_changed?".to_sym
"#{a}".to_sym.destroy
end
end
end
传递了remove_...
参数,但没有删除任何内容:
... "remove_banner"=>"1" ...
有什么想法?感谢。
更新
即使简化它也不起作用:
after_validation { banner.clear if remove_banner == '1' }
"remove_banner"=>"1"
在参数中出现。 u.banner.clear
然后u.banner.save
在控制台中正常工作。
答案 0 :(得分:0)
我通过这样的关注来解决这个问题:
# must be included after attachment declarations in model
module RemoveAttachment
extend ActiveSupport::Concern
included do
attachment_definitions.keys.each do |name|
attr_accessible :"remove_#{name}"
attr_accessor :"remove_#{name}"
before_validation { send(name).destroy if send("remove_#{name}") == '1' }
define_method :"remove_#{name}=" do |value|
instance_variable_set :"@remove_#{name}", value
send("#{name}_file_name_will_change!")
end
end
end
end
只需在任何需要的地方包括关注点。感谢this回答了一个巨大的线索。