Ruby on Rails CSV ставит "" вместо реальных кавычек - PullRequest
10 голосов
/ 08 октября 2010

Я пытаюсь создать файл 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 ]

29 голосов
/ 08 октября 2010

Вместо вызова html_safe для каждой части массива и создания из него новой (не безопасной для html) строки, попробуйте вызвать ее в конце, после того как строка будет возвращена из generate_line:

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

ОБНОВЛЕНИЕ: В целях безопасности вы должны быть уверены, что этот шаблон отправляется в браузер не как HTML , а как необработанный text / csv . файл. Если содержимое строки содержит какие-либо фактические HTML-теги, такие как <script>, они не будут экранированы, поскольку вы объявили вывод как «безопасный».

Если этот контент нужно выводить на HTML-странице, то вам лучше рассмотреть правильное экранирование, а не обходить его следующим образом.

Подумайте, действительно ли вам нужен шаблон html.erb для генерации CSV.

1 голос
/ 08 октября 2010

Вот шаблон, который я использовал, который работает достаточно хорошо:

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

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

Вы можете сделать это полностью внутри контроллера, если хотите, и вместо этого отобразить его как тип :text.

Также полезно, если вы упорядочите содержимое по порядку, в данном случае простой хэш @report внутри контроллера, чем выполнять всю тяжелую работу в представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...