ruby-on-rails-3 - remote - respond_to rails
Rails 3-establece el nombre de archivo en un respond_to (3)
Alternativamente, puedes usar una combinación de send_data y render_to_string (ya que tienes una plantilla 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
Esto parece que debería ser simple, pero parece que no puedo encontrar una respuesta directa.
Agregué un tipo mime csv y lo siguiente parece funcionar, excepto que el archivo descargado siempre se llama "report.csv".
En mi controlador:
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
Creo que está usando el renderizador predeterminado (no he implementado un renderizador alternativo), pero parece que no puedo encontrar documentos completos sobre las opciones disponibles.
¿No hay algo como una opción de "nombre de archivo" o algo que pueda usar? ¿Hay un mejor enfoque?
Lo tengo, gracias a un poco de ayuda de esta respuesta .
format.csv do
response.headers[''Content-Disposition''] = ''attachment; filename="'' + filename + ''.csv"''
render "summary/report.csv.erb"
end
Primero establece el nombre de archivo en el encabezado de respuesta, luego llama a render
.
(La plantilla param para render
es opcional, pero en mi caso la necesitaba).
Puede pasar el nombre del archivo a send_data
y dejar que maneje el encabezado 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
Luego, agregue un método to_csv
a my_report
o pase una cadena CSV generada previamente.