2012-02-11 1 views
6

Я использую paperclip для добавления вложений изображений нескольким моделям и Activeadmin для обеспечения простого интерфейса администратора.Удаление приложения скрепки в Activeadmin

У меня есть этот код в моем файле модели activeadmin, который позволяет загружать видео изображения:

form :html => { :enctype => "multipart/form-data"} do |f| 
f.inputs "Details" do 
    f.input :name 
    f.input :subdomain 
end 
f.inputs "General Customisation" do 
    f.input :standalone_background, :hint => (("current image:<br/>").html_safe + f.template.image_tag(f.object.standalone_background.url(:thumb))).html_safe, :as => :file 
end 
end 

, который работает отлично. Все изображения, которые я прикрепляю как это, являются необязательными, поэтому я хотел бы дать пользователю возможность удалить ранее добавленное изображение, но не может решить, как это сделать в Activeadmin. Весь пример, который я видел, касается ситуаций, когда вложения управляются с помощью отдельной ассоциации has_many, а не являются частью основной модели.

Кто-нибудь знает, как это сделать?

ответ

1

Вы можете реализовать это, создав собственный метод. Это может быть сделано

member_action :custom_action, :method => :get do 
//code 
end 

Кроме того, вы должны добавить пользовательский столбец со ссылкой, например, как

index do 
    column "Custom" do |item| 
    link_to "Custom action", "/admin/items/custom_action" 
    end 
end 
1

Другим вариантом является, чтобы иметь флаг состояния для крепления или изображений. Перед сохранением отредактированного объекта вы отсоединяете изображение.

2

В вашем активном представлении админ

form :html => { :enctype => "multipart/form-data"} do |f| 
f.inputs "Details" do 
    f.input :name 
    f.input :subdomain 
end 
f.inputs "General Customisation" do 
    f.input :standalone_background, :hint => (("current image:<br/>").html_safe + f.template.image_tag(f.object.standalone_background.url(:thumb))).html_safe, :as => :file 
    f.input :remove_standalone_background, as: :boolean, required: false, label: "remove standalone background" 
end 
end 

В модели

Вы можете определить флаг статуса, как сильфона

attr_writer :remove_standalone_background 

def remove_standalone_background 
    @remove_standalone_background || false 
end 

ИЛИ (амортизируется в рельсах 3.2)

attr_accessor_with_default : standalone_background,false 

before_save :before_save_callback 

И

def before_save_callback 
    if self.remove_standalone_background 
    self.remove_standalone_background=nil 
    end 
end 
+0

Вы забыли фактически удалить вложение с standalone_background.clear – kars7e

1

Благодарим за помощь. Это последний рабочий код ...

админ/product.rb

f.input :image, required: false, hint: (("Current image:<br/>").html_safe + f.template.image_tag(f.object.image.url(:thumb))).html_safe 
f.input :remove_image, as: :boolean, required: false, label: "Remove Image" 

модели/product.rb

attr_writer :remove_image 

def remove_image 
    @remove_image || false 
end 

before_validation { self.image.clear if self.remove_image == '1' } 
0

Хотя accepts_nested_attributes_for(:foo, allow_destroy: true) работает только с ActiveRecord ассоциаций как belongs_to мы можем позаимствовать из своего проекта, чтобы аналогичная работа была выполнена с удалением скрепки.

(Для того, чтобы понять, как вложенные атрибуты работают в Rails см http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html).

Добавить метод <attachment_name>_attributes= писатель, как показано ниже на модель, которая уже использует has_attached_file:

has_attached_file :standalone_background 

def standalone_background_attributes=(attributes) 
    # Marks the attachment for destruction on next save, 
    # if the attributes hash contains a _destroy flag 
    # and a new file was not uploaded at the same time: 
    if has_destroy_flag?(attributes) && !standalone_background.dirty? 
    standalone_background.clear 
    end 
end 

Метод <attachment_name>_attributes= называет Paperclip::Attachment#clear, чтобы отметить прикрепление для разрушения при следующей сохранении модели.

Далее откройте существующий app/admin/your_model_here.rb файла (используйте правильный путь к файлу для вашего приложения) и настройка сильных параметры, чтобы разрешить вложенный атрибут _destroy флага на <attachment_name>_attributes:

ActiveAdmin.register YourModelHere do 

    permit_params :name, :subdomain, 
    :standalone_background, 
    standalone_background_attributes: [:_destroy] 

В том же файл, добавьте вложенную _destroy флажка в блок ActiveAdmin form. Этот флажок должен быть вложен в <attachment_name>_attributes, используя semantic_fields_for (или один из других методов вложенных атрибутов, предоставляемых formtastic).

form :html => { :enctype => "multipart/form-data"} do |f| 
    f.inputs "Details" do 
    ... 
    end 
    f.inputs "General Customisation" do 
    ... 
    if f.object.standalone_background.present? 
     f.semantic_fields_for :standalone_background_attributes do |fields| 
     fields.input :_destroy, as: :boolean, label: 'Delete?' 
     end 
    end 
    end 
end 

Ваша форма должна теперь показывать флажок delete, когда есть приложение. Проверка этого флажка и отправка правильной формы должны удалить вложение.

Источник: https://github.com/activeadmin/activeadmin/wiki/Deleting-Paperclip-Attachments-with-ActiveAdmin

 Смежные вопросы

  • Нет связанных вопросов^_^