Rails 3 - установить имя файла в response_to

Кажется, это должно быть просто, но я могуКажется, я не нашел прямого ответа.

Я добавил MIME-тип CSV, и, кажется, работает следующее,Кроме что загруженный файл всегда называется "report.csv».

В моем контроллере:

def report
  respond_to do |format|
    format.html
    format.csv do
      render :template => "summary/report.csv.erb",
             :filename => "foo" #doesn't work
    end
  end
end

Я думаю это'с использованием рендерера по умолчанию (у меня нетт реализовал альтернативный рендерер), но я не могуКажется, я не нашел полных документов по доступным опциям.

Isn»там что-то вродеимя файла" вариант или что-то, что я могу использовать? Есть ли лучший подход?

 Grant Birchmeier15 окт. 2012 г., 21:47
Я видел этот пост раньше, но я посмотрел его снова из-за вашего комментария, и он щелкнул. Теперь у меня есть рабочий ответ. Благодарю.
 knownasilya15 окт. 2012 г., 21:40
Может быть, этот пост поможет:stackoverflow.com/questions/617055/...

Ответы на вопрос(3)

render_to_string (так как у вас есть шаблон CSV).

def report
  respond_to do |format|
    format.html
    format.csv do
      send_data render_to_string(:template => "summary/report.csv.erb"),
             :filename => "foo"
    end
  end
end
 David Díaz Clavijo23 окт. 2014 г., 15:25
согласно документации: filename - предлагает имя файла для браузера. " Но это не работает. В Chrome, загружая файл, он устанавливает имя в конец маршрута, 'путь / download.csv»
Решение Вопроса

Я получил это, благодаря некоторой помощи отэтот ответ

format.csv do
  response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
  render "summary/report.csv.erb"
end

Сначала вы задаете имя файла в заголовке ответа, затем вызываете.render

(Шаблонный параметр дляrender необязательно, но в моем случае мне это было нужно.)

 deakolt07 мая 2013 г., 02:39
хорошо ... я получил это на работу, просто делая заголовки, а не response.headers
 Grant Birchmeier02 июн. 2016 г., 18:23
Кто-нибудь знает почему меняется заголовокпосле призваниеrender должно сработать? Isn»Т это как загрузка лодки после нееs уже покинули док?
 Jorge Sampayo21 нояб. 2014 г., 16:19
На Rails 4 должно быть также после рендера, как сказал йок.
 deakolt07 мая 2013 г., 02:01
При попытке получить это решение я получаю: неопределенную локальную переменную или метод "заголовки", Есть идеи, почему это может произойти? Откуда берется этот ответ?
 leishman07 июл. 2017 г., 20:36
Я получил это для работы со встроенным PDF, изменив заголовок для использования "в соответствии" вместо "крепление»
 Mike Yockey25 сент. 2014 г., 19:42
На Rails 3.2 мне пришлось установить заголовокпосле зовет рендер. Этот совет может нуждаться в обновлении.
 Grant Birchmeier07 мая 2013 г., 18:09
@deakolt - я могуТ полностью объяснить, где этоresponse переменная происходит от. Я думаю это'предоставленоActionController :: Base, Может быть это'установленоrespond_to блок? Не видя твой код, я могудогадываюсь чторазные.

Вы можете передать имя файлаsend_data и пусть он обрабатывает заголовок Content-Disposition.

# config/initializers/csv_support.rb
ActionController::Renderers.add :csv do |csv, options|
  options = options.reverse_merge type: Mime::CSV
  content = csv.respond_to? :to_csv ? csv.to_csv : csv.to_s
  send_data content, options
end

# app/controllers/reports_controller.rb
respond_to do |format|
  format.html ...
  format.csv { render csv: my_report, filename: 'my_report.csv' }
end

Затем добавьтеto_csv метод дляmy_report или передать предварительно сгенерированную строку CSV.

Ваш ответ на вопрос