代码之家  ›  专栏  ›  技术社区  ›  titaniumdecoy Mr. T

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

  •  4
  • titaniumdecoy Mr. T  · 技术社区  · 15 年前

    我的rails应用程序在加载/报告/生成报告时生成xml。

    在一 分离 page,我想把这个xml读入一个变量并保存到数据库中。

    我该怎么做?我是否可以将/reports/generate_report.xml uri中的响应流化为一个变量?或者,既然xml是由同一个web应用程序生成的,有没有更好的方法来实现它呢?

    以下是我的生成报告操作:

    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 Jablanovi_)

    @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 回复  |  直到 15 年前
        1
  •  2
  •   Mladen Jablanović    15 年前

    也许您可以将XML呈现逻辑提取到同一个控制器(可能是私有控制器)中的单独方法中,该方法使用 render_to_string ,并从 generate_report archive_current 行动。

        2
  •  1
  •   gtd    15 年前

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

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

        3
  •  1
  •   Kalyan    15 年前

    @输出=product.all.to_XML

        4
  •  0
  •   Art Shayderov    15 年前

    对不起,您是对XML还是对会话有疑问?我的意思是你的行为产生了这个问题的xml素材?还是只想保存操作的输出供以后使用?
    你在一个“单独”的页面上说-你是说在另一个请求上?(比如在用户批准之后?) 为什么要保存输出?因为它应该完全按渲染的方式保存?(例如,如果用户单击以保存一个报表,而您保存了另一个报表,则用户可能会感到沮丧) 还是说这玩意很贵?
    或者可能是,我搞错了,是关于重构的?