如何创建应用程序范围的对象

时间:2011-06-29 08:45:29

标签: ruby-on-rails ruby

我的应用程序是一个表单构建器:定义了表单,然后以通常的CRUD方式显示激活的表单。激活表单的过程触发FormManager创建主Form对象的子类(我使用ActiveRecord中的STI创建type的子类,使用Object.const_set()) 。可以停用活动表单,这涉及杀死该子类定义(使用Object.const_send(:remove...)

我的应用程序只需要 1 FormManager对象。最好的方法是什么?我目前正在ApplicationController中使用一个类变量来实现这一点...它有效,但看起来有点笨拙:

require 'lib/form_manager.rb'

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  attr_reader :registry

  protect_from_forgery

  @@registry = FormManager.new
end

我正在运行ruby 1.8.7,在开发模式下运行2.3.11 - 我看到这只是因为我处于开发模式吗?

3 个答案:

答案 0 :(得分:10)

不,它只是这样运作。 Rails具有请求 - 响应模型,并且对于每个请求,它创建一些控制器的新实例(可能从您的ApplicationController继承),设置一些请求参数然后激活您的操作方法。如果要在请求之间共享状态,则需要将其置于控制器之外,例如在服务器启动应用程序时初始化常量(只是Ruby)。

如果您需要单个注册表实例,只需将其放在“config / initializers / registry.rb”中:

require 'lib/form_manager.rb'

REGISTRY = FormManager.new

Template.all(:conditions => { :is_active => false }).each do |t|
  REGISTRY.loadForm(t.id)
end

然后在ApplicationController中:

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time

  protect_from_forgery

  def registry
    REGISTRY
  end
end

答案 1 :(得分:2)

您可能希望将FormManager设为单身:

http://dalibornasevic.com/posts/9-ruby-singleton-pattern-again

答案 2 :(得分:1)

是的,将为每个请求创建一个新的ApplicationController对象(您可以通过添加运行“puts self.id”的before_filter来检查它,以检查控制器对象的对象ID。您会注意到每个请求都不同请求)。

为什么您需要跨请求的单个对象?你想要实现什么目标?