我已经关注了Railscasts和类似的GoRails视频 - 搜索SO [rails] [csv] export
无济于事。有一个类似但难以理解的问题/答案称为Two Export Buttons to CSV in Rails。我可以添加一个按钮将我的表记录导出到csv(已选择此按钮的所有记录)。
我想在我的视图页面添加第二个(或第n个)按钮,以导出表记录的子集...例如。 Event.where(country: some_country)
除了导出模型的所有记录的当前(工作正常)按钮/下载之外。我认为这将是csv导出的常见用法。
这就是我所拥有的,倒退的工作:
事件索引视图:我有一个下载按钮导出为CSV(为字形图像添加了辅助代码)
<%= link_to glyph(:save), "events.csv", class: "btn btn-success" %>
如果我想要第二个动作,我需要一条与events.csv
不同的路线,对吗?所以,我尝试了一个新的按钮,将“events.csv”更改为@events_us.csv
。
事件控制器:定义了'what'并作为所有记录回复(使用ransack和will_paginate gems):
def index
@search = Event.ransack(params[:q])
@events = @search.result.paginate(:page => params[:page], :per_page => 50)
@events_all = Event.all
respond_to do |format|
format.html # need to have html
format.csv { send_data @events_all.to_csv, filename: "Events-#{Date.today}.csv" }
end
end
我应该在format.csv
中添加第二个respond_to do...
吗?尝试过(即定义了一个不同的实例变量,如@events_us = Event.where(country: "US")
,但无济于事。虽然有两个format.csv
s似乎很奇怪。而且,我得到No route matches [GET] "/@events_us.csv"
我可能不需要说太多,因为我在这一方面都失去了各种各样的东西。
事件模型:使用all
范围,csv库等来组织csv:
def self.to_csv
column_names = Event.column_names.map(&:to_s) - %w[id created_at updated_at]
CSV.generate(headers: true) do |csv|
csv << column_names
all.each do |record|
csv << record.attributes.values_at(*column_names)
end
end
end
如果我在控制器中有第二个respond_to动作,我可以使用第二种方法,如self.to_csv_us
吗?
def self.to_csv_us
column_names = Event.column_names.map(&:to_s) - %w[id created_at updated_at]
CSV.generate(headers: true) do |csv|
csv << column_names
@events_us.each do |record|
csv << record.attributes.values_at(*column_names)
end
end
end