Paperclip (w/Amazon s3)on Rails 3.既存の添付ファイルを削除したい更新アクションを使用して、置換せずに.
私はこの ここ の1つの例を見つけただけで、それを動作させることができませんでした、それは削除しないだけで、ログに何も理由がありませんでした。フォームで次のようなことをしたかったのです。
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(ページはモデルの名前、画像は添付ファイルを保持する属性名です)
しかし、そのチェックボックスを検出するにはどうすればよいですか?さらに重要なのは、画像を削除するにはどうすればよいですか?助けてくれてありがとう!
まず、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」に更新し、ユーザーが保存されると、イメージが削除されるかどうかをチェックします。
_has_attached_file :asset
_
=>
_ attr_accessor :delete_asset
before_validation { asset.clear if delete_asset == '1' }
_
アセットを破壊する必要はありません。Paperclipが行います。
form.check_box(:delete_asset)
の形式で十分です。
これは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
これをページモデルにも忘れずに追加してください。
attr_accessible :image_delete
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