与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文件关联元素将变为""
。我希望""
,甚至一无所有。
结果文件样本:
Nicolas, Nico
Joe, ""
如何防止这种情况发生?
答案 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字符串,然后只需使用collect
和join
将它们完美地组合在一起。
如果你喜欢在不同的行上使用它,你也可以这样做:
<% 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
。
无论如何,希望有助于清理一些人的代码。