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

时间:2010-10-07 20:39:00

标签: ruby-on-rails csv

我正在尝试生成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;

2 个答案:

答案 0 :(得分:28)

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

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

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

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

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

答案 1 :(得分:1)

这是我用过的模板,效果很好:

<%=
  response.content_type = 'application/octet-stream'

  FasterCSV.generate do |csv|
    csv << @report[:columns]
    @report[:rows].each do |row|
      csv << row
    end
  end
%>

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

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