Ruby on Rails CSV ставит & quot; вместо реальных цитат

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

Решение

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

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

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

Если этот контент необходимо выводить на 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
%>

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

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

Другие вопросы по тегам