我正在构建简单的导出交易功能,单击即可下载 csv 或 json 格式的文件。如果我执行 <%= link_to \'CSV\', export_invoices_path(format: :csv), class: link_cl...
我正在构建简单的导出交易功能,点击即可下载 csv 或 json 格式的文件。
如果我做
<%= link_to "CSV", export_invoices_path(format: :csv), class: link_classes %> |
<%= link_to "JSON", export_invoices_path(format: :json, start_date: params[:start_date], end_date: params[:end_date]), class: link_classes %>
并在控制器中
respond_to do |format|
format.csv { send_data generate_csv(@invoices), filename: "transactions-#{Date.today}.csv" }
format.json { send_data JSON.pretty_generate(@invoices.as_json), filename: "transactions-#{Date.today}.json" }
end
它就是这样工作的。
但是当我用表单替换视图代码时,页面只是重新加载,并且没有下载任何文件
<%= form_tag export_invoices_path, method: :get, class: "mb-6" do %>
<div class="flex justify-center gap-2 items-center">
<p class="font-semibold">Start Date:</p>
<%= date_field_tag :start_date, params[:start_date], class: "form-control" %>
<p class="font-semibold">End Date:</p>
<%= date_field_tag :end_date, params[:end_date], class: "form-control" %>
<%= submit_tag "Export to CSV", name: nil, params: { format: :csv }, class: link_classes %>
<%= submit_tag "Export to JSON", name: nil, params: { format: :json }, class: link_classes %>
</div>
<% end %>
我现在想使用表单,因为现在我想传递多个参数,例如 start_date 和 end_date,以便在导出期间引入交易过滤
它应该在表单提交时下载文件
你使用的 submit_tag
好像是 button_to
, params: {format: :csv}
不适用于 submit_tag
。使用提交按钮执行此操作的唯一方法是覆盖表单操作:
<%= form_tag export_invoices_path, method: :get do %>
<%= submit_tag "Export to CSV",
formaction: export_invoices_path(format: :csv) %>
<%= submit_tag "Export to JSON",
formaction: export_invoices_path(format: :json) %>
<% end %>
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#formaction