ruby-on-rails - Rails 渲染 HTML 也会在相同的操作中下载 CSV 文件
问题描述
我有一个带有索引操作的用户控制器,它具有搜查搜索。我的要求是我在 UI 中有一个表单,用户可以使用该表单进行搜索,结果应该显示在 HTMl 中,并且我想将其下载为 CSV 文件。
users_controller.rb
def index
users = User.includes(:client).filter_by(filter_params).order(updated_at: :desc)
@search = users.ransack(params[:q])
@users = @search.result(distinct: true).paginate(page: params[:page])
respond_to do |format|
format.html
format.csv { send_data @users.to_csv, filename: "users-#{Date.today}.csv" }
end
end
index.html.erb
<div class="container" style="margin-top: 100px">
<%= search_form_for @search, :url => admin_users_url , :builder => SimpleForm::FormBuilder, html: { novalidate: "novalidate"} do |f| %>
<div class="row">
<div class="col-md-3">
<%= f.input :id_eq, :placeholder => "contains", :item_wrapper_class => 'inline', label: "ID" %>
</div>
<div class="col-md-3">
<%= f.input :name_cont, :placeholder => "contains", :item_wrapper_class => 'inline', label: "Name" %>
</div>
<div class="col-md-3" style="margin-top: 24px">
<%= f.submit "Search", :class => "btn btn-primary" %>
<%= link_to "Export Results to CSV", admin_users_path(params.merge(format: "csv")), :class => "btn btn-info" %>
</div>
</div>
<% end %>
</div>
我知道可能会发生两种格式渲染中的一种。我也希望以 CSV 格式导出搜索结果。这样做的正确方法是什么...
问题是“导出到 CSV”作为一个单独的按钮工作,搜索表单字段与此按钮没有任何联系。如何将搜索表单结果导出到 CSV?
解决方案
只需使用 javascript 创建一个事件处理程序,该处理程序设置请求格式并在用户单击“将结果导出为 CSV”按钮时提交表单。
document.getElementById('to_csv')
.addEventListener('click', function(e){
var form = e.target.form;
e.preventDefault();
form.action += '.csv';
form.submit();
});
<form action="/foo/bar">
<button id="to_csv">Export Results to CSV</button>
</form>
推荐阅读
- javascript - 单击后退浏览器历史记录按钮时,Firefox 不会触发 vuejs 钩子
- javascript - 为什么我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数?
- asp.net-mvc-3 - .Net Core 3 HtmlGrid WithFooter 不是一个选项
- c# - Using mocked objects (Moq) with methods that use reflection in C#?
- javascript - Stripe Payments not showing correctly every time
- sql - 如何在 SQL Server 中使用左外连接?
- r - Assigning numerical value to answers to calculate results in Shiny
- javascript - useSelector 或 useContext
- openssl - 使用 OpenSSL 将 .cer 和 .key 文件转换为 .pfx 文件
- python - Running Selenium on AWS Juypter Notebook Instance - Errors