Ruby on rails RubyonRails&;引用&;引用;而不是实际的报价

Ruby on rails RubyonRails&;引用&;引用;而不是实际的报价,ruby-on-rails,csv,Ruby On Rails,Csv,我正在尝试生成CSV文件。除了空白字段外,一切都很好,我不确定是否有“而不是实际的引号。我提供了用于生成文件和一些输出的代码 <% headers = ["Username", "Name", "E-mail", "Phone Number"] %> <%= CSV.generate_line headers %> <% @users_before_paginate.each do |user| %> <% row = [ "#{user.user

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

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

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

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

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


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

以下是我使用过的一个非常有效的模板:

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

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

谢谢这很有效,完全符合我的要求。我以前就应该意识到这一点。实际上,你也可以调用
row.to_csv.html_safe
,因为
Array
s有一个
to_csv
方法。@AdamLeonard当我试图生成csv时,它成功地创建了,但没有不必要的空行(rows)。@SajjadMurtaza可能使用and(注意虚线)谢谢,这是一个有用的模板,不完全是我想要的,但它将有助于将来的参考。例如,您可以将其放入名为
export.csv.erb
的文件中,以确保它不是HTML转义的。@tadman这实际上是不正确的。您必须明确地将CSV输出标记为html安全,即使它位于.CSV.erb文件中。此外,您的答案似乎是主张将视图代码放入控制器,这没有任何意义。
<%=
  response.content_type = 'application/octet-stream'

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