web-dev-qa-db-ja.com

Rails Paperclip添付ファイルを削除する方法?

Paperclip (w/Amazon s3)on Rails 3.既存の添付ファイルを削除したい更新アクションを使用して、置換せずに.

私はこの ここ の1つの例を見つけただけで、それを動作させることができませんでした、それは削除しないだけで、ログに何も理由がありませんでした。フォームで次のようなことをしたかったのです。

<%- unless @page.new_record? || [email protected]? -%>
    <%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>

(ページはモデルの名前、画像は添付ファイルを保持する属性名です)

しかし、そのチェックボックスを検出するにはどうすればよいですか?さらに重要なのは、画像を削除するにはどうすればよいですか?助けてくれてありがとう!

83
jyoseph

まず、form_forにcheck_boxを作成すると(実際のように見えます)、フォームはデフォルトで:image_deleteをチェック済みの場合は「1」、未チェックの場合は「0」として送信する必要があります。メソッド宣言は次のようになります。

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

これは、必要に応じて他の値を割り当てることができることを示していますが、もちろんオプションです。

次に、添付先のモデルインスタンスを削除せずに手動で添付ファイルを削除する呼び出しは次のとおりです。

@page.image.destroy #Will remove the attachment and save the model
@page.image.clear #Will queue the attachment to be deleted

また、チェックボックスを使用して画像を削除する方法を実現するには、おそらく次のようなものをページモデルに追加します。

class Page < ActiveRecord::Base
  has_attached_file :image

  before_save :destroy_image?

  def image_delete
    @image_delete ||= "0"
  end

  def image_delete=(value)
    @image_delete = value
  end

private
  def destroy_image?
    self.image.clear if @image_delete == "1"
  end
end

このように、フォームを作成して:image_deleteチェックボックスを追加すると、Userインスタンスからデフォルト値「0」がロードされます。そして、そのフィールドがチェックされると、コントローラーはimage_deleteを「1」に更新し、ユーザーが保存されると、イメージが削除されるかどうかをチェックします。

100
DanneManne

_has_attached_file :asset_

=>

_    attr_accessor :delete_asset
    before_validation { asset.clear if delete_asset == '1' }
_

アセットを破壊する必要はありません。Paperclipが行います。

form.check_box(:delete_asset)の形式で十分です。

95
Benoit B.

これはBenoitの答えですが、モジュールに包まれており、ネストされた属性モデルのエッジケースをカバーしています。

モデルのすべての添付ファイルに適用されます。

# This needs to be included after all has_attached_file statements in a class
module DeletableAttachment
  extend ActiveSupport::Concern

  included do
    attachment_definitions.keys.each do |name|

      attr_accessor :"delete_#{name}"

      before_validation { send(name).clear if send("delete_#{name}") == '1' }

      define_method :"delete_#{name}=" do |value|
        instance_variable_set :"@delete_#{name}", value
        send("#{name}_file_name_will_change!")
      end

    end
  end

end
12
Paul Odeon

これをページモデルにも忘れずに追加してください。

attr_accessible :image_delete
5
Glenn McW

Paulのソリューションの修正バージョン。Rails 5つのカスタム属性をサポートします。ファイルの先頭、has_attached_file定義。

module Mixins
  module PaperclipRemover

    extend ActiveSupport::Concern

    included do
      attachment_definitions.keys.each do |name|

        attribute :"remove_#{name}", :boolean

        before_validation do
          self.send("#{name}=", nil) if send("remove_#{name}?")
        end

      end
    end

  end

end
0
JBlake