4

类似于这个问题,除了我不在html_safe整个项目中的任何地方使用。

我像这样生成一个 CSV 文件index.csv.erb

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

问题:如果数据库(ActiveRecord/MySQL)中的昵称为 NULL,则 CSV 文件关联元素变为&quot;&quot;. 我会期待"",甚至什么都不会。

结果文件示例:

Nicolas, Nico
Joe, &quot;&quot;

我怎样才能防止这种情况发生?

4

2 回答 2

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 并非如此。

于 2011-09-09T08:47:43.283 回答
0

重构

Benoit 是绝对正确的,感谢您的提示。在查看您的代码后,我发现生成 CSV 的方法也更加简洁,我想我会与那些登陆这里的人分享(比如我!):

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

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

如果您更喜欢将它放在单独的行上,您也可以执行以下操作,我这样做:

<% 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在每行的末尾添加 a。

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

于 2015-04-29T15:10:11.470 回答