Rails CSV放“”而不是实际引号

时间:2011-09-09 07:40:22

标签: ruby-on-rails-3 csv fastercsv html-safe

this question类似,但我不会在整个项目中的任何地方使用html_safe

我在index.csv.erb生成一个CSV文件,如下所示:

<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
  @persons.each do |person|
    csv << [ person[:name], person[:nickname] ]
  end
end
%>

问题:如果数据库中的昵称为NULL(ActiveRecord / MySQL),则CSV文件关联元素将变为&quot;&quot;。我希望"",甚至一无所有。

结果文件样本:

Nicolas, Nico
Joe, &quot;&quot;

如何防止这种情况发生?

2 个答案:

答案 0 :(得分:14)

这里的问题是您没有使用html_safe。您的昵称字段为空,并在csv文件中转换为"",但Rails和html转义后认为它不安全。

只需在结果上调用html_safe

<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
  @persons.each do |person|
    csv << [ person[:name], person[:nickname] ]
  end
end .html_safe
%>

您链接到的解决方案不再适用于Rails 3,因为默认情况下所有字符串都被认为是不安全的,而Rails 2中并非如此。

答案 1 :(得分:0)

重构

Benoit是完全正确的,谢谢你的提示。看了你的代码后,我看到了一个更清晰的方法来生成你的CSV,我想我会分享给那些登陆的人(像我一样!):

<%=
response.content_type = 'application/octet-stream'
@persons.collect{ |person| [ person[:name], person[:nickname] ].to_csv }.join.html_safe 
%>

基本上,您不需要所有CSV生成的东西。 Ruby可以使用Array并将其转换为CSV字符串,然后只需使用collectjoin将它们完美地组合在一起。

如果你喜欢在不同的行上使用它,你也可以这样做:

<% response.content_type = 'application/octet-stream' -%> 
<% @persons.each do |person| -%>
  <%= [ person[:name], person[:nickname] ].to_csv( row_sep: nil ).html_safe %>
<% end -%>

在这里,您需要使用-%>以确保不会获得额外的空行,并且您需要使用row_sep: nil选项,以便to_csv不会在每行的末尾添加\n

无论如何,希望有助于清理一些人的代码。