ruby singleton配置在异常后不获取配置的值

时间:2015-04-14 12:27:54

标签: ruby-on-rails ruby

我正在构建一个Ruby on Rails单例类,我希望能够在初始化应用程序时配置这个类。

我遵循了这篇文章:

http://brandonhilkert.com/blog/ruby-gem-configuration-patterns/ https://robots.thoughtbot.com/mygem-configure-block

我所做的更改:

我没有创建一个gem文件,我在加载应用程序时加载我的单例类,方法是将类文件路径添加到config.autoload_paths

我在“initializers”目录中添加了一个文件,如下所示。

MYClass.configure do |config|
  config.api_key = APP_CONFIG['key']
  config.api_secret_key = APP_CONFIG['secret_key']
  config.base_url ='https://api.domain.com'
  config.api_version = 'v2'
end

我的班级看起来像这样:

module MYClass
  class << self

    attr_writer :configuration

   #do something just simulate a call to the configuration class
   def get_api_config
      configuration.api_key
   end


  end 


  def self.configuration
    @configuration ||= Configuration.new
  end

  def self.configure
    yield(configuration)
  end


  class Configuration
    attr_accessor :api_key, :api_secret_key, :base_url, :api_version
    def initialize
      @api_key = nil
      @api_secret_key = nil
      @base_url = 'https://api.domain.com'
      @api_version = 'v2'
    end
  end
end

除非我有例外,否则一切正常。

之后,我的配置对象在下次调用MyClass.get_api_config和api_key,api_secret_key are equals to nil时再次分配

1 个答案:

答案 0 :(得分:0)

如何使用extend self使其成为真正的单身人士。通常,配置不需要实例化,因为它是整个应用程序中可用的自由浮动单例。试试这个,看看它是如何为你工作的

module MyClass
  class << self
     def get_api_config
       Configuration.api_key
     end
     def configure
       block_given? ? yield(Configuration) : Configuration
     end
     def configuration
       Configuration
     end
  end


  module Configuration
    extend self
    attr_accessor :api_key, :api_secret_key, :base_url, :api_version

    def base_url
      @base_url ||= 'https://api.domain.com'
    end
    def api_version
      @api_version ||= 'v2'
    end
    def config(&block)
      instance_eval(&block)
    end
  end
end

我添加了您使用的所有方法,但我认为不需要其中一些方法。我还为您设置了默认设置,而无需初始化Configuration的类,因为它似乎不需要超过1个实例。

现在你可以做像

这样的事情
MyClass.configure do |config|
  config.api_key = "Test KEY"
  config.api_secret_key = "Secret"
end
MyClass::Configuration.api_secret_key 
#=> "Secret"
MyClass::Configuration.base_url
#=> "https://api.domain.com"
MyClass.configuration.api_version
#=> 'v2'
MyClass.get_api_config
#=> "Test KEY"
MyClass::Configuration.singleton_methods
#=>[:api_key, :api_key=, :api_secret_key, :api_secret_key=, 
    :base_url, :base_url=, :api_version, :api_version=, :config]

在这种情况下,无论在应用程序中调用它们的位置如何,对MyClass :: Configuration的所有引用都将始终返回相同的内容。