在 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 => '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 JavaScript 仅在您刷新页面时加载,而不是在原始页面加载时加载,这是怎么回事?