Ruby on rails ruby singleton配置在异常后无法获取配置的值

Ruby on rails ruby singleton配置在异常后无法获取配置的值,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在构建一个RubyonRails单例类,我希望能够在应用程序初始化时配置这个类 我跟随这篇文章: 我所做的更改: 我没有创建gem文件,我正在加载我的singleton类,同时通过将类文件路径添加到config.autoload\u paths 我在“initializers”目录中添加了一个文件,如下所示 MYClass.configure do |config| config.api_key = APP_CONFIG['key'] config.api_secret_key =

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

我跟随这篇文章:

我所做的更改:

我没有创建gem文件,我正在加载我的singleton类,同时通过将类文件路径添加到
config.autoload\u 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

class使用
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

在这种情况下,对MyClass::Configuration的所有引用将始终返回相同的值,无论它们在应用程序中的何处被调用。

您能更明确地解释一下“有异常”的含义吗?。rails开发模式代码重载的根本原因是什么?我真的不理解你的问题。在我的类中,我调用RestClient::Resource.post,如果捕获此异常后post返回异常404,则配置参数将消失。如果在设置config.cache\u classes=true并重新启动后问题没有发生,则是重新加载开发模式代码让您感到困惑up@FrederickCheung我会尽力的,但是。。为什么使用此模式的所有其他gem都没有出现这种情况?gem不会重新加载,但应用程序中的代码每次出现异常时,此配置对象都不起作用。配置对象仅包含
@base\u url和@api\u version
变量和arguments@user730250如果没有处理异常,那么当然是的,因为整个应用程序崩溃,所有上下文都将丢失。否则,设置的变量将在整个运行过程中保持不变。我一直在使用这种配置文件。
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]