2

我正在使用 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 的最简单方法是传递相同的参数,即传递相同的 URL,并在产品末尾添加一个 .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

如何在视图中重用当前 URL 来创建新 URL?

然后关于批量删除:我不知道如何处理,因为我迄今为止只使用过 RESTful 路由。假设我遵循上述想法并再次重用 URL,但将其发送到(尚未定义??)批量删除操作。我应该如何尽可能地将其路由为 RESTful?只是添加方法::删除?我会在我的控制器中将其路由到哪里?

有点不知所措。

4

1 回答 1

3

我认为关键是重用了 ransack 搜索表单和参数,而不是 url。

如果你只是想使用 index 动作来执行删除或渲染 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

我写了很多,如果你有任何问题,请在下面评论:)

于 2013-08-24T08:26:38.413 回答