Где я должен разместить код, который генерирует электронную таблицу Excel?
-
12-09-2019 - |
Вопрос
Я использую электронная таблица gem для создания собственного файла Excel.Это не CSV, а XML-файл.Для создания файла используется обычный Ruby-код.Сгенерированный файл Excel (хранится в StringIO
) пересылается клиенту с помощью send_data
способ.Мне нужно send_data
метод из-за его параметров, таких как disposition
.
Данные для Excel извлекаются методом контроллера точно так же, как и для обычных запросов HTML, JS.Однако я поместил код для создания электронной таблицы в метод, защищенный контроллером.Не так, как следовало бы.
Существует ли элегантное решение вышеуказанной проблемы, совместимое с шаблоном проектирования MVC?
Обновить:Популярного и принятого всеми решения вышеуказанной проблемы не существует, но, по крайней мере, я знаю все возможные идеи.
Решение
- Создайте библиотеку Excel в своей папке lib, в которую вы включите процедуру генерации xls, а также метод, который переопределяет ActionController
render
способ. - В модели, которая должна быть представлена в виде xls, реализуйте метод, вызываемый
to_excel
метод, который генерирует хэш, который вы можете предоставить своей подпрограмме xls. Делая это таким образом, вы получите что-то действительно "рельсовое".В своем контроллере вы просто вызовете
рендеринг:xls => @model
Другие советы
Каталог lib предназначен как место для кода, который не является строго частью структуры MVC, но будет необходим нескольким моделям, представлениям или контроллерам.Его можно привезти с собой require
когда это необходимо.
Однако, если вам нужен код только в одном контроллере, с таким же успехом вы могли бы поместить его во вспомогательный модуль этого контроллера.Таким образом, он загружается автоматически и находится у вас под рукой.К тому же, в этом есть смысл:это код, помогающий конкретному контроллеру.
В любом случае, не оставляйте его в своем контроллере и не пытайтесь встроить в свой вид.
я только что сделал это сегодня для своего приложения, надеюсь, это поможет для Excel o / p ;никогда не использовал никаких плагинов
контроллер:экспорт определения pr = Program.find(сессия[: pr_id]) заголовки ['Content-Type']="приложение / vnd.ms-excel" заголовки['Content-Dispositon']='вложение;имя файла="report.xls"' @voucherdatas = Voucherdata.find_all_by_pr_name(pr.pr_name) завершение
Вид:экспорт.html.erb
менеджер "отчеты/voucherdatas", :object =>@voucherdatas %>маршруты.rb карта.ресурсы:отчеты,:коллекция =>{:экспорт =>:получить}
куда бы вы ни захотели, ссылку предоставьте
link_to "Экспортировать в Excel", export_reports_url, :popup=> true