Rails Paperclip как удалить приложение?
Я использую Paperclip (с Amazon s3) в Rails 3. Я хочу удалить существующее вложение без его замены используя действие обновления.
Я нашел только один пример этого здесь и не мог заставить его работать, он просто не удалял, и в журналах ничего не было сказано Зачем. Я хотел сделать что-то подобное в форме:
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(страница - это имя модели, изображение - это имя атрибута, которое содержит вложение)
Но как определить этот флажок и, что более важно, как удалить изображение? Я ценю любую помощь!
Ответы
Ответ 1
Во-первых, когда вы создаете check_box в form_for (как он выглядит, как вы), форма должна по умолчанию отправлять: 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, она будет загружать значение по умолчанию "0" из экземпляра пользователя. И если это поле отмечено, тогда контроллер обновит файл image_delete до "1", и когда пользователь будет сохранен, он проверяет, должно ли оно быть удалено.
Ответ 2
has_attached_file :asset
= >
attr_accessor :delete_asset
before_validation { asset.clear if delete_asset == '1' }
Не нужно уничтожать активы, это сделает Паперклип.
В форме form.check_box(:delete_asset)
будет достаточно.
Ответ 3
Это ответ 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
Ответ 4
Не забудьте добавить это и к своей модели страницы:
attr_accessible :image_delete