rails 3.1生成CSV文件

时间:2011-10-18 18:58:17

标签: ruby-on-rails ruby-on-rails-3 csv ruby-on-rails-3.1

我可以将表格数据导出为CSV文件,但每条记录后面都有一个空白行。为什么以及如何解决它?

index.html.erb中的

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>

在index.csv.erb

<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row %>
<%- end -%>

5 个答案:

答案 0 :(得分:9)

CSV.generate_line在它生成的行的末尾添加了一个换行符,但<%= %>也是如此,所以你得到两行。

要从erb表达式输出中取消换行符,请使用以下语法:<%= -%>

这样:

<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers -%>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row -%>
<%- end -%>

接受的答案留在erb生成的新行中但是会抑制来自CSV.generate_line的新行,我认为这不是最好的方法。

答案 1 :(得分:6)

这就是修复它的原因。

<%= CSV.generate_line row, :row_sep => ?\t, :quote_char => ?\ %>

答案 2 :(得分:2)

对于我使用strip和html_safe工作后,在生成行后应用:

<%- headers = ["Id", "Tour No"] -%>
<%= CSV.generate_line(headers).strip%>
<%- @tours.each do |t| -%>
<%-   row = [ t.id,t.tour_no] -%>
<%= CSV.generate_line(row).html_safe.strip%>
<%- end -%>

答案 3 :(得分:0)

试试这个:

row = [ n.id, n.fname.strip ]

strip会删除\ r和/或\ n,这可能会导致空行。我没有任何其他解释你的源代码是好的!

答案 4 :(得分:0)

我以为我会用我的解决方案来解决这个问题。

基本上在我的本地机器(Mac)上,一切都运行得很好,然后当我将我的应用程序部署到heroku时,它会开始添加这些神秘的新行。

对我来说,解决方案是使用:

CSV.generate_line(row, row_step: ?\r).html_safe

请注意,我使用的是rails 4.1.6。

希望能帮助其他人挣扎