Подтвердить что ты не робот

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" или что-то, что я могу использовать? Есть ли лучший подход?

4b9b3361

Ответ 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