当我阅读您的问题时,我现在不知道这种机制是如何工作的(尽管我有一个很好的主意。)这就是我想出来的,将源代码读取到 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
这将为您提供选项类变量中的键列表