在Activeadmin中删除回形针附件

时间:2012-02-11 15:34:10

标签: ruby-on-rails paperclip activeadmin

我正在使用paperclip将图像附件添加到多个模型和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 个答案:

答案 0 :(得分: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

在你的模特中

您可以定义状态标志,如bellow

attr_writer :remove_standalone_background

def remove_standalone_background
  @remove_standalone_background || false
end

OR(在rails 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 :(得分: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

答案 2 :(得分:1)

另一种选择是为附件或图像设置状态标志。在保存编辑对象之前,请取消链接图像。

答案 3 :(得分: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' }

答案 4 :(得分:0)

虽然MERGE仅适用于Select col1, max(col2) AS col2 into #ControlTable from tab1 GROUP BY col1 MERGE tablenew AS T USING #ControlTable AS S ON (T.col1 = S.col1) WHEN NOT MATCHED BY TARGET THEN INSERT(col1, col2) VALUES(S.col1, S.col2) WHEN MATCHED THEN UPDATE SET T.col2 = S.col2 之类的ActiveRecord关联,但我们可以从其设计中借用以类似的方式删除回形针附件。

(要了解嵌套属性在Rails中的工作原理,请参阅http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html).

将以下accepts_nested_attributes_for(:foo, allow_destroy: true)编写器方法添加到已使用belongs_to的模型中:

<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 ActiveAdmin.register YourModelHere do permit_params :name, :subdomain, :standalone_background, standalone_background_attributes: [:_destroy] 块。此复选框必须使用_destroy(或者formtastic提供的其他嵌套属性方法之一)嵌套在form中。

<attachment_name>_attributes

当存在附件时,您的表单现在应显示删除复选框。选中此复选框并提交有效表单应该删除附件。

来源:https://github.com/activeadmin/activeadmin/wiki/Deleting-Paperclip-Attachments-with-ActiveAdmin