Rails 3 - установить имя файла в response_to
Кажется, что это должно быть просто, но я не могу найти прямой ответ.
Я добавил csv mime-type и, похоже, работает, кроме, что загруженный файл всегда называется "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
Я думаю, что это с использованием средства рендеринга по умолчанию (я не реализовал альтернативный рендерер), но я не могу найти полные документы о доступных параметрах.
Нет ли что-то вроде опции "filename" или что-то, что я могу использовать? Есть ли лучший подход?
Ответы
Ответ 1
Я получил его, благодаря некоторой помощи этого ответа.
format.csv do
response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
render "summary/report.csv.erb"
end
Сначала вы задаете имя файла в заголовке ответа, затем вызываете render
.
(Параметр шаблона render
не является обязательным, но в моем случае он мне нужен.)
Ответ 2
Вы можете передать имя файла 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.
Ответ 3
В качестве альтернативы вы можете использовать комбинацию send_data и 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