rails 3 - 在哪里放置app启动初始化的东西?

时间:2011-03-10 11:34:50

标签: ruby ruby-on-rails-3

在我的应用程序(jruby,rails 3,mongodb)中,我在初始化程序/config/initializers/app_constants.rb中设置了我的数据访问对象(以及其他“单例”)

DATA_COLLECTION_STORE = DataCollectionStore.new(...)

SOME_OTHER_SINGLETON = SomeOtherClassTreatedLikeSingleton.new(...)

我是rails(和ruby)的新手,我意识到了一些事情。首先,设置这些“单例”不一定是正确的方法,因为这些类可以在代码中的任何其他地方实例化(现在假设不会发生)。其次,当我尝试运行测试(rake spec)或构建WAR(使用warble)时,将这些“常量”放在这个初始化器中似乎是错误的b / c我可以看到初始化器的东西正在运行所以我正在创建与mongo的连接,开始我的“some_other_singleton”等等。

这种东西应该去哪里?

提前感谢我对我的诺言的耐心:)

1 个答案:

答案 0 :(得分:2)

您无需在任何配置文件中实际初始化单例。 相反,您可以在类中实现一个返回单例的类方法。以下代码将允许您使用DataCollectionStore.instance

访问单例
class DataCollectionStore
  @@instance = DataCollectionStore.new

  def self.instance
    @@instance
  end

  def initialize
    #intitialize you instance here
  end

end

请记住,您必须在development.rb中将config.cache_classes设置为true才能在开发环境中使用。但是,默认情况下,类会在生产中缓存。

或者,您可以将类本身用作单例对象,并在类方法中实现您的功能。

如果您的初始化很昂贵,您可以使用下面的代码片段懒散地进行初始化。这样,如果您的测试实际调用实例类方法,您只需支付价格。 您可以在视图中输出DataCollectionStore.instance并使用不同的浏览器加载页面,在应用中对此进行测试。如果一切正常,您应该在两个浏览器中看到相同的时间戳。

class DataCollectionStore
  @@instance = nil

  def self.instance
    @@instance || @@instance = self.new
  end

  def initialize
    @initialized_time = Time.now
  end

  def to_s
    @initialized_time
  end
end