1. ホーム
  2. ruby-on-rails

[解決済み] Rails Paperclip 添付ファイルを削除する方法は?

2023-04-27 09:36:34

質問

私は ペーパークリップ (w/ Amazon s3) on Rails 3を使用しています。既存の添付ファイルを削除したい を置き換えることなく を更新アクションを使って削除したいです。

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

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

(pageはモデル名、imageは添付ファイルを保持する属性名)

しかし、どのようにそのチェックボックスを検出し、さらに重要なことは、どのように画像を削除するのでしょうか?私はどんな助けでも感謝します!

どのように解決するのですか?

まず、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

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

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"に更新し、Userが保存されるときに、画像が削除されるかどうかをチェックします。