0

I have an instance of singleton class SingletonClass within module Modulename

Modulename::SingletonClass.instance

which has a hash @hashname. I have a method on SingletonClass that adds new keys to @hashname.

When I add a new key to @hashname, I can see the new key exists by doing puts @hashname in the controller, but when I do it in SingletonClass, it seems that the new key is not added. Why is that? Why am I able to see the change in the @hashname from controller but not from the singleton class?

Here is a code that reproduces the behaviour I'm trying to describe :

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

When I do this from my controller :

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

Then this also from controller :

singleton.do_something

The new item gets printed out so its good.

But when I invoke another_method from my within my singleton class, the new item appears not to be added

4

1 回答 1

0

This code worked fine for me when MyMode.all returned values. But when it was an empty array, then @items = became nil.

that happens because:

[].reduce(:merge)
=> nil

Easiest way to fix is probably:

@items = {}
people = MyMode.all.map{|c| {c.name => c.secondary_name}}.reduce(:merge)
@items = people if people
于 2013-07-17T00:11:02.657 回答