Загрузка страницы в память в Rails - PullRequest
4 голосов
/ 03 апреля 2010

Мое приложение 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 ]

2 голосов
/ 03 апреля 2010

Возможно, вы могли бы извлечь свою логику рендеринга XML в отдельный метод в том же контроллере (возможно, в частном), который бы отображал XML в строку, используя render_to_string, и вызывать ее как generate_report и archive_current действий.

1 голос
/ 03 апреля 2010

@ output = Product.all.to_xml

1 голос
/ 03 апреля 2010

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

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

0 голосов
/ 03 апреля 2010

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

...