我想获得所有配置变量,但我不太了解Rails配置......
比方说,我在test.rb中有类似config.myvar
的内容,在运行时我做了:
MyApp::Application.config.myvar # works
MyApp::Application.config.send("myvar") # works as well
如果我是正确的,我可以假设它是一个函数,如doc中所指定的那样。然而,调用methods
会给我(很多)方法,但不是我的......
与instance_variables
或我可以尝试的任何内容相同。
如果你有任何线索,显然有一些我想念的东西:)
答案 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
将为您提供选项类变量
中的键列表