Rails中的惯用CSV导出

Bit*_*ise 2 ruby csv ruby-on-rails

我有一个索引视图,submissions并且在该视图中@submissions,控制器看起来像这样:

提交控制器

def index 
  @submissions = Submission.submissions_for(user: current_user)
end
Run Code Online (Sandbox Code Playgroud)

从视图中,我基本上想单击一个按钮并传递该列表中的 submissions

我曾想过要添加一条新路线,如下所示:

<%= link_to "Export", export_submissions_path(submissions: @submissions) %>
Run Code Online (Sandbox Code Playgroud)

但这感觉不太正确,因为我需要留在索引页面上。因此,当用户单击export按钮时,他们停留在index页面上,但是创建了当前数据的CSV。因此,这个问题是“如何创建CSV”,更多的是我如何停留在索引页面上并向服务器发送请求以发送CSV?

Rol*_*der 5

您可以通过单个控制器操作交付不同格式的视图。

class SubmissionsController < ApplicationController
  def index
    @submissions = Submission.submissions_for(user: current_user)

    respond_to do |format|
      format.html
      format.csv { send_data @submissions.to_csv, filename: "users-#{Date.today}.csv" }
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,如果您执行请求,.csv它将交付csv而不是视图。

要获取正确的URL,请使用url_helper,如下所示:

link_to 'CSV Export', submissions_path(format: :csv)
Run Code Online (Sandbox Code Playgroud)