【问题标题】:Rails3 CSV putting "" instead of actual quotesRails3 CSV 用 "" 代替实际引号
【发布时间】:2011-11-13 14:00:04
【问题描述】:

类似于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 文件关联元素变为 &amp;quot;&amp;quot;。我希望"",甚至什么都没有。

结果文件示例:

Nicolas, Nico
Joe, &quot;&quot;

如何防止这种情况发生?

【问题讨论】:

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


    【解决方案1】:

    重构

    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 -%>
    

    在这里,您需要使用-%&gt; 以确保不会出现多余的空白行,并且您需要使用row_sep: nil 选项,这样to_csv 就不会添加\n每行的结尾。

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

    【讨论】:

      【解决方案2】:

      这里的问题是您没有使用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 并非如此。

      【讨论】:

      • 感谢您发布此信息。我遇到了同样的问题。
      • 太棒了!解决了头痛。
      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多