如何在Rails应用程序中获取配置变量?

时间:2013-04-03 15:38:50

标签: ruby ruby-on-rails-3

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

比方说,我在test.rb中有类似config.myvar的内容,在运行时我做了:

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

如果我是正确的,我可以假设它是一个函数,如doc中所指定的那样。然而,调用methods会给我(很多)方法,但不是我的...... 与instance_variables或我可以尝试的任何内容相同。

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

1 个答案:

答案 0 :(得分: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

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

然而,这是一个相当小的类,没有任何东西允许调用任意方法。让我们上链吧。这是::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

将为您提供选项类变量

中的键列表