【问题标题】:Ruby on Rails CSV putting "" instead of actual quotesRuby on Rails CSV 将 "" 替换为实际引号
【发布时间】:2010-10-07 20:38:59
【问题描述】:

我正在尝试生成 CSV 文件。一切都很好,除了空白字段,我不太确定有 "" 而不是实际的引号。我已经提供了用于生成文件和一些输出的代码。

<% headers = ["Username", "Name", "E-mail", "Phone Number"] %>
<%= CSV.generate_line headers %>

<% @users_before_paginate.each do |user| %>
  <% row = [ "#{user.username}".html_safe ] %>
  <% row << "#{user.profile.first_name} #{user.profile.last_name}".html_safe unless user.profile.blank? %>
  <% row << "#{user.email}".html_safe unless user.profile.nil? %>
  <% row << "#{user.profile.phone}".html_safe unless user.profile.nil? %>
  <%= CSV.generate_line row %>
<% end %>

输出

Username,Name,E-mail,Phone Number

  admin,LocalShopper ,shoplocally1@gmail.com,&quot;&quot;
  Brian,Oliveri Design ,brian@oliveridesign.com,727-537-9617
  LocalShopperJenn,Jennifer M Gentile ,localshopperjenn@hotmail.com,&quot;&quot;

【问题讨论】:

    标签: ruby-on-rails csv


    【解决方案1】:

    不要在数组的每个部分调用 html_safe 然后从中创建一个新的(非 html 安全的)字符串,而是在字符串从 generate_line 返回后尝试在最后调用它:

    <%= CSV.generate_line(row).html_safe %>
    

    更新:为了安全起见,您需要确保该模板不是作为 HTML 发送到浏览器,而是原始 text/csv 文件。如果行内容包含任何实际的 HTML 标记,例如 &lt;script&gt;,这些标记不会被转义,因为您已将输出声明为“安全”。

    如果此内容需要在 HTML 页面中输出,那么您最好考虑正确转义,而不是像这样绕过它。

    考虑是否真的需要html.erb 模板来生成 CSV。

    【讨论】:

    • 谢谢,这很好用,完全符合我的要求。我之前应该意识到这一点。
    • 您实际上也可以调用row.to_csv.html_safe,因为Arrays 有一个to_csv 方法。
    • @AdamLeonard 当我尝试生成 CSV 时,它的创建成功但有不必要的空行(行)。
    • @SajjadMurtaza 可能使用 和 (注意破折号)
    【解决方案2】:

    这是我用过的一个很好用的模板:

    <%=
      response.content_type = 'application/octet-stream'
    
      FasterCSV.generate do |csv|
        csv << @report[:columns]
        @report[:rows].each do |row|
          csv << row
        end
      end
    %>
    

    如果您愿意,您可以完全在控制器中执行此操作,并将其呈现为 :text 类型。

    如果您将内容按顺序排列(在本例中为简单的@report 哈希),在控制器内部而不是在视图中完成所有繁重的工作,这也会有所帮助。

    【讨论】:

    • 谢谢这是一个有用的模板,不是我想要的,但它会很好地供将来参考。
    • 您可以将其放入一个名为 export.csv.erb 的文件中,例如以确保它不是 HTML 转义。
    • @tadman 这实际上是不正确的。您必须将 CSV 输出明确标记为 html 安全,即使它位于 .csv.erb 文件中。此外,您的回答似乎是主张将视图代码放入控制器中,这没有任何意义。
    猜你喜欢
    • 2021-12-22
    • 2011-11-13
    • 1970-01-01
    • 2014-06-21
    • 2011-07-03
    • 1970-01-01
    • 2012-02-14
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多