您可以使用自己的操作呈现自定义视图并从那里发布对类别的更改。像这样的东西:
在admin/product.rb
batch_action :set_category do |selection|
if (@products = Product.where(id: selection)).blank?
redirect_to :back, flash: {error: "No products were selected!"}
else
render template: 'products/edit_group_category' #, layout: 'some_custom_layout' - I had some problems trying to use active_admin layout here, but custom one works fine (you may need it for styling)
end
end
在views/products/edit_group_category.html.haml
=form_for :group_category, url: :update_group_category do |f|
-@products.each do |product|
=f.hidden_field :products, :multiple => true, :value => product.id
=f.input :category, as: :radio, collection:['cat1', 'cat2', 'cat3']
=f.submit 'Submit'
在controllers/products_controller.rb
def update_group_category
products = Product.where(params[:group_category][:products])
#set here category with name params[:group_category][:category] to all of products
redirect_to '/admin/products', notice: 'Category set' #you may have another redirect path
end
在routes.rb
post 'update_group_category' => 'products#update_group_category'
您可以尝试将该update_group_category
操作置于admin/product.rb
块中controller
,但我认为将其保留在普通控制器中会更好。
另一种可能更用户友好的方式是使用 js 和 ajax - 您可以使用拦截批处理操作提交事件
$("#collection_selection").submit ->
if $("#batch_action").val() == "set_category"
dialog_url = '/products/edit_group_category?'+ $(this).serialize();
openDialog dialog_url
false
一些函数在哪里openDialog
,应该dialog_url
通过 AJAX 加载所需的表单并将其显示在对话框中(如jQuery UI 对话框)。在控制器操作edit_group_category
中,您可以使用Product.where(id: params[:collection_selection])
由于批处理操作块永远不会以这种方法运行,因此您可以只batch_action :set_category
留下admin/product.rb