0

ペーパークリップ付きのモデルがあります。モデルを別の画像で更新しようとすると、新しいファイルの名前が古いファイルと同じである場合を除いて、すべて正常に機能します。

ファイル名が同じでも、ペーパークリップは新しいファイルであることを理解していないと思います。

それを機能させるアイデアはありますか?

4

2 に答える 2

1

私はこれに対するエレガントな解決策を見つけることができませんでしたが、これが私がそれを機能させる方法です:

モデルにattr_accessorブールフラグを設定し、trueの場合は、Paperclipsaveメソッドを呼び出して強制的に更新します。

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
于 2012-10-23T22:28:27.473 に答える
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
于 2014-05-15T05:46:59.900 に答える