在 Rails 中将页面加载到内存中

Posted

技术标签:

【中文标题】在 Rails 中将页面加载到内存中【英文标题】:Loading a page into memory in Rails 【发布时间】:2011-02-03 22:54:27 【问题描述】:

当我加载 /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 =&gt; '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")

【问题讨论】:

只是好奇您为什么尝试将数据转换为 xml,然后再次将其保存到数据库中。 @Salil:我想在数据库中存储以前版本的数据,有点像版本控制。 【参考方案1】:

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

【讨论】:

我能够使用@output = render_to_string(:file => 'reports/generate_report.xml.builder') 将页面呈现为字符串,而无需进行任何更改。感谢您的帮助。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

@output = Product.all.to_xml

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在 Rails 中将页面加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章

如何在rails中异步加载部分页面

我无法在 Django 中将图像加载到我的页面。啥都试过

静态页面加载后加载 Rails

Rails JavaScript 仅在您刷新页面时加载,而不是在原始页面加载时加载,这是怎么回事?

在 js.erb 中渲染 Rails 部分而不重新加载整个页面

如何在Rails中将服务目录添加到加载路径?