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,""
Brian,Oliveri Design ,brian@oliveridesign.com,727-537-9617
LocalShopperJenn,Jennifer M Gentile ,localshopperjenn@hotmail.com,""
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
хэш, внутри контроллера, чем делать всю тяжелую работу в представлении.