我使用ransack过滤产品列表。我现在想重新使用当前选择来返回excel文件(因此我可以在同一页面中将链接“将过滤后的产品下载为excel”)或对过滤后的结果执行删除。例如。被调用的URL看起来像:
http://localhost:3000/products?utf8=%E2%9C%93&q%5Bstatusowner_id_or_client_producer_id_eq%5D=&q%5Bkind_eq%5D=&q%5Bstatus_eq%5D=9&commit=Select
我看到返回excel的最简单方法是传递相同的参数来传递相同的网址,只在产品末尾添加.xls:
http://localhost:3000/products.xls?utf8=%E2%9C%93&q%5Bstatusowner_id_or_client_producer_id_eq%5D=&q%5Bkind_eq%5D=&q%5Bstatus_eq%5D=9&commit=Select
如何重复使用视图中的当前网址来创建新网址?
然后关于批量删除:我不知道如何处理,因为我只使用RESTful路由到目前为止。假设我遵循上述想法并再次重用URL,但将其发送到(尚未定义的)批量删除操作。我应该如何将其作为RESTful路由?只需添加方法::删除?我的控制器在哪里可以路由它?
有点不知所措。
答案 0 :(得分:3)
我认为关键点在于重用搜索搜索表单和参数,而不是网址。
如果您只想使用索引操作来执行delete或render excel,则可以保持route.rb不变。
在视图中,我假设你有一个搜索表单
<%= search_form_for @products do |f| %>
# YOUR CONDITIONS
<%= f.submit 'query' %> #Just query
# add two new buttons.
<button id="output_xls" name="output_xls">Output</button>
<button id="mass_delete" name="mass_delete">Delete</button>
<% end %>
您可以在2个按钮上使用javascript。单击按钮时,JS会将相应的参数添加到表单并提交它。
$('#output_xls').click(function(){
$('form').append('<input type="hidden" name="format" value="xls" />');
$('form').get(0).submit();
});
$('#mass_delete').click(function(){
$('form').append('<input type="hidden" name="method" value="delete" />');
$('form').get(0).submit();
});
在控制器中,您可以根据参数决定逻辑。
def index
#EXECUTE RANSACK SEARCH
if params.delete(:method) == 'delete'
#DELETE RECORDS
end
respond_to do |format|
format.html {# DO YOUR REDIRECTING }
format.xls {# OUTPUT YOUR EXCEL }
end
end
请记住在config / initializers / mime_types.rb中注册mime类型。
Mime::Type.register "application/vnd.ms-excel", :xls
我写了很多,如果您有任何问题,请在下面评论:)