#ruby-on-rails #ruby-on-rails-3 #csv #ruby-on-rails-3.1
#ruby-on-rails #ruby-on-rails-3 #csv #ruby-on-rails-3.1
Вопрос:
Я могу экспортировать данные таблицы в файл CSV, однако после каждой записи остается пустая строка. Почему и как мне это исправить?
в index.html.erb
<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>
в index.csv.erb
<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row %>
<%- end -%>
Комментарии:
1. Я попробовал ваш код, и, похоже, он работает. Нет пустой строки после каждой записи. Возможно, вам нужно проверить n.fname, у вас может быть символ новой строки в содержимом поля.
2. @MatteoAlessani, похоже, отсутствует в записях базы данных. Где-нибудь еще я могу посмотреть? Могу ли я просто удалить новые строки из строки перед созданием строки?
3. да, вы можете попытаться удалить их или поле.
4. @MatteoAlessani я это исправил. Эта строка сделала свое дело. Я думаю, что это как-то связано с переключением ruby на fastercsv в ruby 1.9. эта строка вводит значения, разделенные табуляцией. <%= Строка CSV.generate_line, :row_sep => ?t, :quote_char => ? %>
Ответ №1:
CSV.generate_line
добавляет символ новой строки в конец строки, которую он генерирует, но делает <%= %>
так, чтобы вы получали две новые строки.
Чтобы исключить символ новой строки из вывода erb
выражения, используйте этот синтаксис: <%= -%>
итак:
<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers -%>
<%- @customers.each do |n| -%>
<%- row = [ n.id, n.fname ] -%>
<%= CSV.generate_line row -%>
<%- end -%>
Принятый ответ остается в новой строке, сгенерированной из erb
, но подавляет новую строку, из CSV.generate_line
которой, я думаю, это не лучший способ сделать это.
Комментарии:
1. Это идеальный ответ. Изначально я решил эту проблему с помощью .html_safe.strip . Это работало до тех пор, пока у меня не появилась строка в двойных кавычках с запятой. Это испортило все мои столбцы и было в недоумении относительно решения, пока не наткнулось на этот ответ. Мое единственное предложение заключается в том, что вам не нужно — в каждой строке, оно должно быть только в той же строке, в которой есть = . Большое вам спасибо!
2. это действительно должно быть принятым ответом. намного чище
Ответ №2:
Это то, что исправило это.
<%= CSV.generate_line row, :row_sep => ?t, :quote_char => ? %>
Комментарии:
1. Я хотел бы узнать больше об этой кодировке. Почему знак вопроса?
2. Из tutorialspoint.com/ruby/ruby_variables.htm — Вы можете получить целочисленное значение, соответствующее символу ASCII или escape-последовательности, поставив перед ним вопросительный знак.
3. По какой-то причине этот метод добавляет дополнительный ‘0’ в конце каждой строки. Есть идеи, почему это может происходить?
Ответ №3:
для меня после использования strip и html_safe сработало, применено после создания строки:
<%- headers = ["Id", "Tour No"] -%>
<%= CSV.generate_line(headers).strip%>
<%- @tours.each do |t| -%>
<%- row = [ t.id,t.tour_no] -%>
<%= CSV.generate_line(row).html_safe.strip%>
<%- end -%>
Ответ №4:
Попробуйте это:
row = [ n.id, n.fname.strip ]
strip удалит r и / или n, что может привести к появлению пустых строк. У меня нет другого объяснения, что ваш исходный код в порядке!
Ответ №5:
Я думал, что подключусь к своему решению, так как просто боролся с этим.
В принципе, на моем локальном компьютере (mac) все работало абсолютно нормально, затем, когда я развернул свое приложение на heroku, оно начало добавлять в эти загадочные новые строки.
Для меня решением было использовать:
CSV.generate_line(row, row_step: ?r).html_safe
В качестве примечания я использую rails 4.1.6.
Надеюсь, это поможет некоторым другим людям, которые борются