Rails - CSV экспорт: запрос на загрузку файла - PullRequest
14 голосов
/ 04 января 2011

Я хочу дать своим пользователям возможность экспортировать таблицу в CSV.

Итак, в моем контроллере я добавил в начало файла:

  respond_to :html, :js, :csv

Я также устанавливаю заголовки, если запрошенный формат csv:

if params[:format] == 'csv'
  generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}") 
end

Код для generate_csv_headers (в application_controller):

  def generate_csv_headers(filename)
    headers.merge!({
      'Cache-Control'             => 'must-revalidate, post-check=0, pre-check=0',
      'Content-Type'              => 'text/csv',
      'Content-Disposition'       => "attachment; filename=\"#{filename}\"",
      'Content-Transfer-Encoding' => 'binary'
    })
  end

Я также создал представление с именем index.csv.erb для создания моего файла:

<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @negotiations.each do |n| -%>
<%- row = [ n.id,
            n.name ] -%>
<%=   CSV.generate_line row %>
<%- end -%>

У меня нет никаких ошибок, но он просто отображает содержимое файла CSV, в то время как я ожидаю, что браузер запросит загрузку файла.

Я много читал, но не смог найти ничего, что сработало бы. У вас есть идея?

спасибо, стр.

Ответы [ 3 ]

10 голосов
/ 04 января 2011

Я до сих пор не уверен, почему это решило проблему, но это произошло.

Я изменил ссылку в представлении на

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>

и теперь это работает!

0 голосов
/ 25 июля 2012

Вас может заинтересовать этот драгоценный камень, который я сделал под названием CSV shaper, который позволяет создавать выходные данные CSV, используя действительно хороший Ruby DSL.

Он также будет корректно настраивать заголовки ответа, одновременно позволяя настраивать имя файла.

https://github.com/paulspringett/csv_shaper

0 голосов
/ 04 января 2011

Я не уверен, что вы должны делать это таким образом, но если вы сгенерируете и сохраните файл, вы можете использовать send_file, чтобы отправить его в браузер. Смотри http://api.rubyonrails.org/classes/ActionController/Streaming.html

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