虽然我已将FooFactory类声明为“Singleton”,但每次都会对其类变量@@ foo进行实例化。为什么会这样?
主要的单身人士课程:
require 'singleton'
class FooFactory
include Singleton
@@foo = nil
def get_foo
print @@foo.nil?.to_s
@@foo ||= "I am a string"
return @@foo
end
end
控制器代码:
class PagesController < ApplicationController
def home
@foo = FooFactory.instance.get_foo
end
end
观看代码:
<%= @foo %>
我希望print
中的FooFactory
方法在第一次实例化false
后应返回FooFactory
。但每次刷新true
视图时,控制台都会继续打印pages/home
。
答案 0 :(得分:6)
在开发模式下,每次请求都会重新加载类,从而丢失可能填入其中的任何类状态。这可以通过在development.rb中查找这一行来改变:
config.cache_classes = false
并将其更改为true
,这通常是在production.rb中设置的。将其设置为false
的原因很方便:您可以编辑代码并点击刷新以查看更改,而无需重新启动服务器。
但是在Rails中,将状态放入类并期望它保持在请求之间并不常见,因为虚拟机来来往往,并且线程化的VM可能无法以线程安全的方式访问类状态。有这些问题的解决方法,但通常有更好的方法来做你正在做的事情。