Загрузка страницы в память в Rails
Мое приложение rails создает XML, когда я загружаю / reports / generate_report.
На отдельной странице я хочу прочитать этот XML в переменную и сохранить его в базе данных.
Как я могу это сделать? Могу ли я как-то передать ответ из URI /reports/generate_report.xml в переменную? Или есть лучший способ сделать это, поскольку XML создается одним и тем же веб-приложением?
Вот мое действие generate_report:
class ReportsController < ApplicationController
def generate_report
respond_to do |format|
@products = Product.all
format.xml { render :layout => false }
end
end
end
Вот действие, которое я пытаюсь написать:
class AnotherController < ApplicationController
def archive_current
@output = # get XML output produced by /reports/generate_report
# save @output to the database
respond_to do |format|
format.html # inform the user of success or failure
end
end
end
Решено: Мое решение (спасибо Младену Яблановичу):
@output = render_to_string(:file => 'reports/generate_report.xml.builder')
Я использовал следующий код в классе модели для выполнения той же задачи, поскольку render_to_string (идиотски) является защищенным методом ActionController::Base:
av = ActionView::Base.new(Rails::Configuration.new.view_path)
@output = av.render(:file => "reports/generate_report.xml.builder")
4 ответа
Возможно, вы могли бы извлечь свою логику рендеринга XML в отдельный метод в том же контроллере (возможно, в частном), который бы отображал XML в строку, используя render_to_string
и назовите это как из generate_report
а также archive_current
действия.
Что я обычно делаю в такой ситуации - это создание отдельного модуля / класса / модели для генерации отчета (это может даже оказаться правильным в модели Продукта). Этот отдельный компонент может быть в app/models
или это может быть в lib
, В любом случае, когда вы извлечете его, вы сможете использовать его в любом месте, где вам это нужно. Контроллер может вызвать его напрямую. Вы можете сгенерировать его из консоли. Вы можете создать cron задание. Это не только более гибко, но также может помочь сгладить время ответа на ваш запрос, если создание отчета будет медленным.
Поскольку вы используете шаблон, понятно, что маршрут контроллера удобен, но даже если вам нужно включить некую систему шаблонов ruby в вашу вспомогательную библиотеку, она все равно, вероятно, будет менее хлопотной и более гибкой, чем попытка пройти через контроллер.
Извините, у вас вопрос по Xml или по поводу сессий? Я имею в виду тот факт, что ваши действия генерируют XML-материал для вопроса? Или вы просто хотите сохранить результат действия для последующего использования?
Вы сказали на "отдельной" странице - вы имеете в виду по другому запросу? (как после того, как пользователь одобрил это?) Почему вы хотите сохранить вывод? Потому что это должно быть сохранено именно так, как отображается? (например, пользователь может расстроиться, если щелкнет, чтобы сохранить один отчет, а вы сохранили другой). Или стоит ли создавать эту вещь дорого?
Или, может быть, я ошибся и речь идет о рефакторинге?