在轨道3/4中,可以通过在模型中定义方法self.to_csv
并将format.csv
添加到控制器中的respond_to
来完成对csv的导出。点击link_to "CSV", index_path(format: "csv")
开始导出。导出再次调用相同的操作并在csv中呈现。
我们的问题是用户如何将当前页面导出到csv。用户可以开始搜索,然后决定将当前页面导出到csv(不重做搜索csv导出)。有没有办法让用户这样做?
更新:csv导出的控制器代码示例:
#for csv download
respond_to do |format|
format.html {@query = @query.page(params[:page]).per_page(30)}
format.csv do
send_data @query.to_csv
@csv = true
end
end
以下是模型中self.to_csv的示例:
def self.to_csv
CSV.generate do |csv|
#header array
header = ['id', 'action', 'resource', 'brief_note', 'last_updated_by_id', 'role_definition_id', 'sql_code', 'masked_attrs', 'rank', 'created_at', 'updated_at']
csv << header
all.each do |config|
#assembly array for the row
.....
#inject to csv
csv << row
end
end
end
如果您的页面考虑了控制器中的搜索参数(比如说@query变量),您可以简单地回调完全相同的控制器,但要求使用CSV格式而不是HTML格式。
假设您在/ users路由中列出用户,并且具有搜索参数,例如:
/users?query=smith
您可以创建一个链接来生成:
/users.csv?query=smith
这将回调相同的控制器,只需更改格式。这可以使用以下代码完成:
link_to "CSV", index_path(format: "csv", :query => @query)