Pregunta

Estoy utilizando joya para generar el archivo de Excel nativos. Esto no es CSV, archivo XML. código Ruby ordinaria se utiliza para crear el archivo. El archivo de Excel generado (guardado en StringIO) es enviado a un cliente utilizando el método send_data. Necesito método send_data debido a sus parámetros como disposition.

Los datos para el Excel se recuperan en el método controlador al igual que para el HTML ordinario, las solicitudes de JS. Sin embargo coloqué el código para generar la hoja de cálculo en el método controlador protegida. No en una vista como debería.

¿Hay una solución elegante al problema anterior Cumple con patrón de diseño MVC?

Actualización:. No hay una popular y aceptado por toda la solución al problema anterior, pero al menos sé que todas las ideas posibles

¿Fue útil?

Solución

  1. Crear una biblioteca de Excel en la carpeta lib en el que se incluye su rutina de generación xls, así como un método que anula método render de ActionController.
  2. En un modelo que se deben representar como xls implementar un método to_excel método llamado que genera un hash que puede proporcionar a su rutina xls.
  3. Hacerlo de esta manera, obtendrá algo realmente "Railsy". En el controlador se le acaba de llamar

    render: xls => @Model

Otros consejos

El directorio lib que se entiende como un lugar para el código que no es estrictamente parte de la estructura MVC, pero será necesaria por múltiples modelos, vistas o controladores. Puede ser llevado en un require cuando sea necesario.

Sin embargo, si sólo se necesita el código en un solo controlador, que sería igual de bien fuera de su puesta en ayudante de dicho controlador. De esa manera es auto-cargado y al alcance de su mano. Además, tiene sentido:. Que es el código para ayudar a un controlador específico

De cualquier manera, no lo deje en su controlador o tratar de cuña en su punto de vista.

Acabo de hacer esto hoy para mi esperanza aplicación que esto ayuda a un Excel o / p; nunca utilizado ningún plugin

controlador: exportación def pr = Program.find (sesión [: pr_id]) cabeceras [ 'Content-Type'] = "application / vnd.ms-excel" cabeceras [ 'Content-dispositon'] = 'de fijación; nombre de archivo = "Informe.xls"' @voucherdatas = Voucherdata.find_all_by_pr_name (pr.pr_name) final

vista: export.html.erb

       gerente           "reportaje / voucherdatas",: Object => @ voucherdatas%>   

routes.rb  map.resources: informes,: Colección => {: exportación =>: get}

whereever u quieren dar el enlace

link_to "Exportar como Excel", export_reports_url,: popup => true

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top