为了从我的对象中删除(回形针)图像,我定义了一个自定义回调(和路由):
ActiveAdmin.register Camping do
#...
member_action :destroy_image, :method => :delete do
camping = Camping.find(params[:id])
camping.image.destroy
redirect_to({:action => :show}, :notice => "Image deleted")
end
end
这按预期工作;通过命名路线destroy_image_admin_camping => /admin/campings/:id/destroy_image
。
问题是我找不到如何将其添加到表单中:
ActiveAdmin.register Camping do
form do |f|
f.inputs "Camping" do
f.input :name
f.input :image
f.action :delete_image, :url => destroy_image_admin_camping_path(@camping.id), :button_html => { :method => :delete }
f.input :description
end
f.actions
end
#...
end
更详细:我不知道如何将“我们正在编辑的当前项目的ID”传递给destroy_image_admin_camping_path
; @camping
为零,f.camping
未定义,因此我不知道如何传递该项目。
这是正确的做法吗?我更喜欢这个“ajax-ish”界面而不是更常见的复选框 - 删除 - 更新后的图像,但我不确定这是否会起作用。
答案 0 :(得分:1)
这里有几个问题,我会尽力解决这些问题。
如何访问我们正在编辑的当前项目的" ID
你非常接近寻找f.camping
。你想要的是f.object
,所以:
destroy_image_admin_camping_path(f.object.id)
。
注意:f.object.id
如果是新表单(而不是编辑表单),则为nil
,您希望通过unless f.object.new_record?
进行检查
"这是正确的方法吗?"
我不确定,真的。对我来说,似乎在没有实际保存当前渲染的表单的情况下发出请求可能会产生复杂性,但它可能会成为一个更好的界面。无论如何,如果你想要复制 - 删除 - 更新图像,这应该可以帮助你:Rails Paperclip how to delete attachment?。
但是,如果您想要ajax-ish方法,我认为您希望将<a>
标记设置为按钮。实际使用按钮的问题在于您不想提交表单。
以下是一个例子:
f.inputs do
link_to 'Delete Image', delete_image_admin_camping_path(f.object.id), class: 'button', remote: true, method: :delete
end
remote: true
会将其设为ajax请求,ActiveAdmin会为<a>
标记提供非常合理的按钮类。基于成功/失败更新界面留给读者练习。
此外,您可能希望使用erb模板而不是Active Admin DSL(请参阅底部的http://activeadmin.info/docs/5-forms.html)。
像这样:
# app/views/admin/campings/_form.html.erb
<%= semantic_form_for [:admin, @post] do |f| %>
<%= f.inputs do %>
<%= f.input :name %>
<%= f.input :image %>
<%# Actually, you might want to check for presence of the image, I don't know Paperclip well enough to demonstrate that though %>
<% unless f.object.new_record? %>
<%= image_tag f.object.image_url %>
<%= link_to 'Delete Image', delete_image_admin_camping_path(f.object.id), class: 'button', remote: true, method: :delete %>
<% end %>
...
<% end %>
<%= f.actions %>
<% end %>