unknownformat respond_to respond remote rails method form error ruby-on-rails-3 ruby-on-rails-3.2

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.