ペーパークリップ付きのモデルがあります。モデルを別の画像で更新しようとすると、新しいファイルの名前が古いファイルと同じである場合を除いて、すべて正常に機能します。
ファイル名が同じでも、ペーパークリップは新しいファイルであることを理解していないと思います。
それを機能させるアイデアはありますか?
ペーパークリップ付きのモデルがあります。モデルを別の画像で更新しようとすると、新しいファイルの名前が古いファイルと同じである場合を除いて、すべて正常に機能します。
ファイル名が同じでも、ペーパークリップは新しいファイルであることを理解していないと思います。
それを機能させるアイデアはありますか?
私はこれに対するエレガントな解決策を見つけることができませんでしたが、これが私がそれを機能させる方法です:
モデルに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
受け入れられた答えは確かに機能します。でも; 特定の分野との結びつきが気に入らなかったので、実際にはこの機能が必要な場所がたくさんありました。以下の懸念はほとんどの場合に機能するはずです(名前に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