Удаление вложения скрепки в Activeadmin - PullRequest
7 голосов
/ 11 февраля 2012

Я использую скрепку, чтобы добавить вложения в изображения к нескольким моделям, и 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, а не являются частью основной модели.

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

Ответы [ 5 ]

2 голосов
/ 03 апреля 2013

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

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
1 голос
/ 11 апреля 2014

Спасибо за вашу помощь, ребята. Это последний рабочий код ...

админ / 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' }
1 голос
/ 18 июня 2012

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

1 голос
/ 14 марта 2012

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

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
0 голосов
/ 04 апреля 2017

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

(Чтобы понять, как работают вложенные атрибуты вRails see 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 flag <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

Ваша форма должна теперь отображать флажок удаления при наличии вложения. Установите этот флажок и отправьте действительный form должен удалить вложение.

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

...