单例在rails中不可变

时间:2013-07-16 23:29:09

标签: ruby-on-rails ruby

我在模块SingletonClass

中有一个单例类Modulename的实例
Modulename::SingletonClass.instance

具有哈希@hashname。我在SingletonClass上有一个方法,可以为@hashname添加新密钥。

当我向@hashname添加新密钥时,我可以通过在控制器中执行puts @hashname来查看新密钥,但是当我在SingletonClass中执行时,似乎是未添加新密钥。这是为什么?为什么我能够从控制器中看到@hashname的更改,而不是单例类中的更改?

这是一个代码,它重现了我试图描述的行为:

module MyModule
    module SubModule

        class SingletonClass

            include Singleton

            def initialize

                @items = {}
                @items = MyMode.all.map{|c| {c.name => c.secondary_name}}.reduce(:merge)

            end

            def add_new_item(name, secondary_name)
                @items[name] = secondary_name
            end

            def do_something
                @items.each do |k,v|
                    ap "#{k} => #{v}"
                end
            end

                    def another_method
                       do_something
                    end

        end
    end
end

当我从我的控制器执行此操作时:

singleton = MyModule::SubModule::SingletonClass.instance
singleton.add_new_item('test', 'test1')

然后这也来自控制器:

singleton.do_something

新项目被打印出来以便它的好处。

但是当我从我的单身人士课程中调用another_method时,似乎没有添加新项目

1 个答案:

答案 0 :(得分:0)

MyMode.all返回值时,此代码适用于我。但是当它是一个空数组时,@items =变为零。

发生这种情况是因为:

[].reduce(:merge)
=> nil

最简单的修复方法可能是:

@items = {}
people = MyMode.all.map{|c| {c.name => c.secondary_name}}.reduce(:merge)
@items = people if people