我有@people
变量包含的数据看起来完全像这样:
[{"id"=>1, "name"=>"Tom", "age"=>"25"},
{"id"=>2, "name"=>"Marry", "age"=>"27"},
{"id"=>3, "name"=>"Jack", "age"=>"28"}]
,并且我正在尝试将数据转换为CSV文件,看起来可能是
id | name | age
1 | Tom | 25
2 | Marry| 27
3 | Jack | 28
但是我的代码生成了一个CSV文件,并以内联方式显示了所有数据。例如:
{"id"=>1,"name"=>"Tom","age"=>25},{"id"=>2, "name"=>"Marry",
"age"=>"27"},{"id"=>3, "name"=>"Jack", "age"=>"28"}
to_csv
操作如下:
def to_csv
CSV.generate(option) do |csv|
csv << column_names
values.each do |value|
csv << value.attributes.values_at(*column_names)
end
end
end
我将此respond_to
块添加到了我的一项操作中:
respond_to do |format|
format.html
format.csv {
send_data @people.to_csv,
filename: "export.csv",
type: 'text/csv; charset=utf-8'
}
我正在从外部获取数据(例如{"id"=>1,"name"=>"Tom","age"=>25 ...
),因此我将该数据推送到@people
变量中以供使用。任何帮助将不胜感激。
答案 0 :(得分:1)
我认为您需要以不同的方式编写函数:
def to_csv(people)
CSV.generate do |csv|
return unless people.count > 0
csv << people[0].keys
people.each do |person|
csv << person.values
end
end
end
我想你甚至可以做
def to_csv(people)
CSV.generate do |csv|
return unless people.count > 0
csv << people[0].keys
csv << people.each.map{|item| item.values}
end
end
然后将其作为函数调用:
respond_to do |format|
format.html
format.csv {
send_data to_csv(@people),
filename: "export.csv",
type: 'text/csv; charset=utf-8'
}
答案 1 :(得分:0)
您不需要像value.attributes.values_at(*column_names)
那样做,只需要做value.values
就可以为您提供要以CSV格式存储的值数组。
例如
people = [{"id"=>1, "name"=>"Tom", "age"=>"25"},
{"id"=>2, "name"=>"Marry", "age"=>"27"},
{"id"=>3, "name"=>"Jack", "age"=>"28"}]
def to_csv
CSV.generate(headers: true) do |csv|
csv << column_names
people.each do |person|
csv << person.values
end
end
end
答案 2 :(得分:0)
这是我的工作方式, 在我的控制器中,我添加了
respond_to do |format|
format.html
format.csv { send_data @people.to_csv }
end
然后
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |project|
csv << people.attributes.values_at(*column_names)
end
end
end
然后不要忘记在您的config / application.rb文件中require 'csv'
然后您可以使用<%= link_to "CSV", people_path(format: "csv") %>