首页 > 解决方案 > 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?

标签: ruby-on-railsformscsv

解决方案


只需使用 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>


推荐阅读