4

当我加载 /reports/generate_report 时,我的 rails 应用程序会生成 XML。

单独的页面上,我想将此 XML 读入一个变量并将其保存到数据库中。

我怎样才能做到这一点?我可以以某种方式将来自 /reports/generate_report.xml URI 的响应流式传输到变量中吗?还是有更好的方法来做到这一点,因为 XML 是由同一个 Web 应用程序生成的?

这是我的 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

已解决:我的解决方案(感谢 Mladen Jabnović):

@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

4 回答 4

2

也许您可以将 XML 呈现逻辑提取到同一控制器(可能是私有的)中的单独方法,该方法将使用 将 XML 呈现为字符串,并从和操作render_to_string调用它。generate_reportarchive_current

于 2010-04-03T10:56:49.887 回答
1

在这种情况下,我通常做的是创建一个单独的模块/类/模型来生成报告(它甚至可能在产品模型中正确)。这个单独的组件可能在app/models,也可能在lib. 无论如何,一旦您将其提取出来,您就可以在任何需要的地方使用它。控制器可以直接调用它。您可以从控制台生成它。您可以让 cron 作业生成它。这不仅更灵活,而且如果报告生成速度变慢,它还可以帮助您缩短请求响应时间。

由于您使用的是模板,因此控制器路由很方便是可以理解的,但即使您必须在辅助库中包含某种 ruby​​ 模板系统,它仍然可能比尝试通过控制器。

于 2010-04-03T06:58:23.400 回答
1

@output = Product.all.to_xml

于 2010-04-03T14:30:46.610 回答
0

对不起,你是关于 Xml 还是关于会话的问题?我的意思是您的操作会为问题生成 Xml 材料吗?或者您只是想保存操作的输出以供以后使用?
您在“单独的”页面上说-您的意思是在另一个请求上?(比如用户批准后?)为什么要保存输出?因为它应该完全按照渲染保存?(例如,如果用户单击保存一份报告而您保存了另一份报告,用户可能会感到沮丧)或者这东西生成成本高吗?
或者可能是,我弄错了,它是关于重构的?

于 2010-04-03T18:31:19.377 回答