2014-05-20 54 views
1

我无法获得此before_save过滤器的工作。我想,我的方法很标准。图像通过回形针上传。回形针,before_save和删除附件

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_... PARAMS都通过了,什么也没有,虽然删除:

... "remove_banner"=>"1" ... 

有什么想法?谢谢。

更新

即使它简化到这不起作用:

after_validation { banner.clear if remove_banner == '1' } 

而且"remove_banner"=>"1"在PARAMS来通过。 u.banner.clear然后u.banner.save在控制台中正常工作。

+0

当你销毁'#{a}'.to_sym - 数据存储在哪里?它是否已经在数据库中,或者是参数散列的一部分? –

+0

'#{a}'表示模型中的每个Paperclip附件。 –

回答

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回答一个巨大的线索。