Onde devo colocar o código que gera planilha Excel?
-
12-09-2019 - |
Pergunta
Eu estou usando planilha gem para gerar arquivos nativo Excel. Este não é CSV, arquivo XML. código Ruby comum é usado para criar o arquivo. O arquivo Excel gerado (mantidos em StringIO
) é encaminhado para um cliente usando o método send_data
. Eu preciso send_data
método por causa de seus parâmetros como disposition
.
Os dados para o Excel é recuperado no método de controle como para HTML comum, os pedidos JS. No entanto I colocado o código para gerar a folha de cálculo no método protegido controlador. Não em uma visão como deveria.
Existe uma solução elegante para compatível problema acima com padrão de projeto MVC?
Update:. Não há popular e aceite por todos solução para o problema acima, mas pelo menos eu sei todas as idéias possíveis
Solução
- Criar uma biblioteca de excel na sua pasta lib em que você incluir sua rotina de geração xls, bem como um método que o método
render
substituições de ActionController. - Em um modelo que deve ser processado como xls implementar um método chamado método
to_excel
que gera um hash que você pode fornecer a sua rotina xls. -
Fazendo dessa forma, você vai ter algo realmente "Railsy". Em seu controlador você só vai chamar
render: xls => @model
Outras dicas
O diretório lib é concebida como um lugar para o código que não é estritamente parte da estrutura do MVC, mas serão necessários por vários modelos, visualizações, ou controladores. Ele pode ser trazido com um require
quando necessário.
No entanto, se você só precisa do código em um único controlador, você estaria tão bem fora colocá-lo em auxiliar que do controlador. Dessa forma, é automaticamente carregado e ao seu alcance. Além disso, faz sentido:. É o código para ajudar um controlador específico
De qualquer maneira, não deixá-lo em seu controlador ou tentar encostá-lo em seu ponto de vista.
Eu só fiz isso hoje para a minha esperança aplicativo que ajuda para um excel o / p; nunca usou qualquer plugin
controlador: exportação def PR = Program.find (sessão [: pr_id]) headers [ 'Content-Type'] = "application / vnd.ms-excel" cabeçalhos [ 'Conteúdo-dispositon'] = 'anexo; nome do ficheiro = "Relatório.xls"' @voucherdatas = Voucherdata.find_all_by_pr_name (pr.pr_name) end
vista: export.html.erb
Gerente "relatórios / voucherdatas",: object => @ voucherdatas%>routes.rb map.resources: relatórios,: collection => {: export =>: get}
whereever u deseja que o vínculo de repasse
link_to "Exportar como Excel", export_reports_url,: pop-up => true