Rails3 CSV ставит "" вместо реальных кавычек - PullRequest
4 голосов
/ 09 сентября 2011

Похоже на этот вопрос за исключением того, что я не использую html_safe в любом месте всего проекта.

Я создаю CSV-файл в index.csv.erb, например:

<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
  @persons.each do |person|
    csv << [ person[:name], person[:nickname] ]
  end
end
%>

ПРОБЛЕМА: Если в базе данных (ActiveRecord / MySQL) псевдоним равен NULL, тогда элемент, связанный с CSV-файлом, становится &quot;&quot;. Я ожидал бы "", или даже ничего вообще.

Пример файла результата:

Nicolas, Nico
Joe, &quot;&quot;

Как я могу предотвратить это?

Ответы [ 2 ]

14 голосов
/ 09 сентября 2011

Проблема в том, что вы не используете html_safe. Ваше поле псевдонима пустое и преобразуется в "" в файле csv, но Rails считает его небезопасным, а html экранирован.

Просто позвоните html_safe по результату:

<%=
response.content_type = 'application/octet-stream'
CSV.generate do |csv|
  @persons.each do |person|
    csv << [ person[:name], person[:nickname] ]
  end
end .html_safe
%>

Решение, на которое вы ссылаетесь, больше не работает с Rails 3, поскольку по умолчанию все строки считаются небезопасными, чего не было в Rails 2.

0 голосов
/ 29 апреля 2015

Refactored

Бенуа абсолютно прав и спасибо за этот совет.Посмотрев на ваш код, я вижу гораздо более четкий подход к генерации вашего CSV, который, как я думал, я бы поделился для тех, кто приземлился здесь (как я!):

<%=
response.content_type = 'application/octet-stream'
@persons.collect{ |person| [ person[:name], person[:nickname] ].to_csv }.join.html_safe 
%>

По сути, вам не нужновсе, что CSV генерирует вещи.Ruby может взять Array и превратить его в строку CSV, а затем просто использовать collect и join, чтобы аккуратно сложить все вместе.

Вы также можете сделать следующее, если предпочитаете иметь егов отдельных строках, что я и делаю:

<% response.content_type = 'application/octet-stream' -%> 
<% @persons.each do |person| -%>
  <%= [ person[:name], person[:nickname] ].to_csv( row_sep: nil ).html_safe %>
<% end -%>

Здесь вам нужно будет использовать -%>, чтобы убедиться, что вы не получите лишних пустых строк, и вам нужно будет использовать опцию row_sep: nilтак что to_csv не добавляет \n в конце каждой строки.

В любом случае, надеюсь, это поможет очистить код некоторых людей.

...