¿Dónde debo colocar código que genera hoja de cálculo Excel?
-
12-09-2019 - |
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
Solución
- 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. - 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. -
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