2013-07-16 4 views
0

У меня есть экземпляр класса одноплодной SingletonClass в модуле ModulenameSingleton в рельсах неизменных

Modulename::SingletonClass.instance 

который имеет хэш @hashname. У меня есть метод на SingletonClass, который добавляет новые ключи к @hashname.

Когда я добавляю новый ключ к @hashname, я могу видеть новый ключ существует, делая puts @hashname в контроллере, но когда я делаю это в SingletonClass, кажется, что новый ключ не добавляется. Почему это? Почему я могу видеть изменения в контроллере @hashname, но не из класса singleton?

Вот код, который воспроизводит поведение я пытаюсь описать:

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 из My внутри моего одноплодного класса, новый элемент появляется не будет добавлен

+0

мы должны видеть код для класса. можете ли вы создать небольшой класс, демонстрирующий это поведение? –

+0

@Jesse Wolgamott, пожалуйста, см. Мое обновление благодаря –

+0

Является ли ваше do_something вызовом из отдельного действия контроллера? –

ответ

0

Этого код работает отлично для меня, когда MyMode.all возвращаемых значений. Но когда это был пустой массив, тогда @items = стал нулевым.

, что происходит, потому что:

[].reduce(:merge) 
=> nil 

Самый простой способ исправить это, вероятно:

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

Спасибо за ваш ответ. 'people' в вашем примере никогда не будет в моем случае. И случай работает для меня, когда я воспроизвожу его в консоли rails, но не в моем приложении. –

+0

Возможно, это так просто, как вы не вызываете его через «MyModule :: SubModule :: SingletonClass.instance.add_new_item (rand(), 'test1») "? –

+0

Моя проблема в том, что этот модуль был включен в Job, который выполнялся другим процессом, а не веб-сервером, поэтому изменения не были обновлены рабочим. благодаря –

Смежные вопросы