我的应用程序是一个表单构建器:定义了表单,然后以通常的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 - 我看到这只是因为我处于开发模式吗?
答案 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。您会注意到每个请求都不同请求)。
为什么您需要跨请求的单个对象?你想要实现什么目标?