我正在使用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关联管理附件而不是主模型的一部分的情况。
有谁知道这样做的方法?
答案 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