0

我想获取所有配置变量,但我不太了解 Rails 配置...

比方说,我config.myvar在 test.rb 中有类似的东西,在运行时我会这样做:

MyApp::Application.config.myvar           # works
MyApp::Application.config.send("myvar")   # works as well

如果我是正确的,我可以假设它是一个函数,如doc中所指定。然而,打电话methods会给我(很多)方法,但不是我的……instance_variables和我可以尝试的任何方法一样。

如果您有任何线索,我显然想念一些东西:)

4

1 回答 1

1

当我阅读您的问题时,我现在不知道这种机制是如何工作的(尽管我有一个很好的主意。)这就是我想出来的,将源代码读取到 rails:

Rails 应用程序配置位于 rails 源的 rails/railties/lib/rails/application.rb 下的 rails 中。我们可以看到它创建了一个配置对象,如下所示:

def config #:nodoc:
  @config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd))
end

所以我们可以Application::Configuration在 rails/railties/lib/rails/application/configuration.rb 中追踪。

然而,这是一个相当小的类,没有任何东西允许调用任意方法。让我们上链。这是 的一个孩子::Rails::Engine::Configuration,所以让我们转到这个文件。(rails/railties/lib/rails/engine/configuration.rb,如果你正确地遵循)。

同样,一个相当小的类具有一组定义的函数。但是,这也有一个父类!::Rails::Railtie::Configuration. 所以我们看下这个文件的来源(rails/railties/lib/rails/railtie/configuration):

最后,我们有流行的#method_missing

  def method_missing(name, *args, &blk)
    if name.to_s =~ /=$/
      @@options[$`.to_sym] = args.first
    elsif @@options.key?(name)
      @@options[name]
    else
      super
    end
  end

阅读本文,我们会看到名称是否包含=,我们将类变量选项 hash 设置为等于第一个参数,并将您调用的方法的名称作为键(在符号化之后)。否则,我们在选项哈希中返回该键的内容。但是,因为它以这种方式工作,所以既不工作#methods也不#instance_variables工作。然而,再次阅读这个文件,我们看到 rails 给了我们一个选项:

  def respond_to?(name)
    super || @@options.key?(name.to_sym)
  end

如果已设置密钥,这将返回 true。

要获取列表,您可以:

MyApp::Application.config.class_variable_get(:@@options).keys

这将为您提供选项类变量中的键列表

于 2013-04-03T16:00:53.387 回答