2016-09-14 35 views
2

在我的Rails應用程序中,我決定使用singleton創建某種工廠來正確獲取對象。開發重新加載後,Rails singleton變空了

配置/初始化/ registry.rb:

registry = Registry.instance 

registry.define_lazy :period_predictor do 
    PeriodPredictor.new(NotificationBuilder.new, 28, 4, 3) 
end 

registry.define_lazy :notification_sender do 
    NotificationSender.new 
end 

的lib/registry.rb:

# Registry class which is singleton and stores values. 
class Registry 
    include Singleton 


    # Define simple value. Like a constant. 
    # 
    # @param key [Symbol] 
    # @param value 
    def define(key, value) 
    container[key] = value 
    end 


    # Define value (block required) which will be calculated when it will be need. 
    # It will calculate it every time when it will be needed. 
    # 
    # @param key [Symbol] 
    # @param block [Proc] 
    def define_lazy(key, &block) 
    container[key] = LazyValue.new(&block) 
    end 


    # Get value. 
    # 
    # @param key [Symbol] 
    # 
    # @return 
    def get(key) 
    value = container[key] 
    if value.is_a?(LazyValue) 
     value = value.call 
    end 

    value 
    end 


    # Get value (hash access). 
    # 
    # @param key [Symbol] 
    # 
    # @return 
    def [](key) 
    get(key) 
    end 


    # Export all the values. 
    # Replacing values of returned hash won't change registry. 
    # 
    # @return [Hash] 
    def export 
    container.clone 
    end 


    # Import hash data to registry 
    # 
    # @param data [Hash] 
    def import(data) 
    data.each do |key, value| 
     @container[key] = value 
    end 
    end 


    private 

    # Get container. 
    # 
    # @return [Hash] 
    def container 
    @container ||= {} 
    end 


    # Class to store lazy value. 
    class LazyValue 
    def initialize(&block) 
     @block = block 
    end 

    def call 
     @block.call 
    end 
    end 
end 

一切工作正常生產。但是當我改變某些東西(甚至在某處添加空間)時,我無法從控制器中獲取單身人士的數據。

Registry.instance成爲註冊表的只是新鮮的實例,並 Registry.instance [:period_predictor]成爲零

同樣的事情發生時,我剛剛離開與單,使類方法。

只有當我關掉單身創建一個常量它沒有做這件事情:

registry = Registry.new 

registry.define_lazy :period_predictor do 
    PeriodPredictor.new(NotificationBuilder.new, 28, 4, 3) 
end 

registry.define_lazy :notification_sender do 
    NotificationSender.new 
end 

REGISTRY = registry 

的Rails版本4.2.5.1

難道有人有爲什麼發生這種情況的任何想法?

回答

相關問題