使用同名文件更新回形针附件

时间:2012-10-23 15:33:42

标签: ruby-on-rails paperclip

我有一个带回形针附件的模型。当我尝试用另一个图像更新模型时,一切正常,除非新文件与旧文件具有相同的名称。

我猜回形针不明白它是一个新文件,即使文件名是相同的。

你有想法让它发挥作用吗?

2 个答案:

答案 0 :(得分:1)

我无法找到一个优雅的解决方案,但这是我如何让它工作:

在模型上有一个attr_accessor布尔标志,当为true时,调用Paperclip保存方法强制更新。

class MyModel < ActiveRecord::Base
   # paperclip attachment
   has_attached_file :image, { ... }

   attr_accessor :creative_uploaded

   before_save :upload_new_creative_if_necessary

   private

   def upload_new_creative_if_necessary
     if creative_uploaded
       # force update of the creative
       image.save
     end
   end
end

在我的控制器中,当文件发生帖子时,我设置了该标志:

@my_instance = MyModel.new( params[:my_model] )
@my_instance.creative_uploaded if params[:my_model][:image]

# ActiveRecord save/handle validations logic as normal

答案 1 :(得分:1)

接受的答案确实有效。然而;我不喜欢它与特定领域的关系,实际上有很多我需要这个功能的地方。以下问题应该适用于大多数情况(它假设您没有在其名称中使用file_name的任何非回形针列。)

module AttachmentUpdatable
  extend ActiveSupport::Concern

  included do
    before_save :check_for_and_save_images
  end

  def check_for_and_save_images
    return if self.new_record?
    self.changed_attributes.each do |attr|
      attr_name = attr[0].to_s
      next unless attr_name.include?('file_name') # Yes, this is an assumption
      image_col = attr_name.gsub('_file_name','')
      self.send(image_col).save
    end
  end

end