Загрузка страницы в память в 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 действия.

@output = Product.all.to_xml

Что я обычно делаю в такой ситуации - это создание отдельного модуля / класса / модели для генерации отчета (это может даже оказаться правильным в модели Продукта). Этот отдельный компонент может быть в app/models или это может быть в lib, В любом случае, когда вы извлечете его, вы сможете использовать его в любом месте, где вам это нужно. Контроллер может вызвать его напрямую. Вы можете сгенерировать его из консоли. Вы можете создать cron задание. Это не только более гибко, но также может помочь сгладить время ответа на ваш запрос, если создание отчета будет медленным.

Поскольку вы используете шаблон, понятно, что маршрут контроллера удобен, но даже если вам нужно включить некую систему шаблонов ruby ​​в вашу вспомогательную библиотеку, она все равно, вероятно, будет менее хлопотной и более гибкой, чем попытка пройти через контроллер.

Извините, у вас вопрос по Xml или по поводу сессий? Я имею в виду тот факт, что ваши действия генерируют XML-материал для вопроса? Или вы просто хотите сохранить результат действия для последующего использования?
Вы сказали на "отдельной" странице - вы имеете в виду по другому запросу? (как после того, как пользователь одобрил это?) Почему вы хотите сохранить вывод? Потому что это должно быть сохранено именно так, как отображается? (например, пользователь может расстроиться, если щелкнет, чтобы сохранить один отчет, а вы сохранили другой). Или стоит ли создавать эту вещь дорого?
Или, может быть, я ошибся и речь идет о рефакторинге?

Другие вопросы по тегам