我現在沒怎麼當我看到你的問題(雖然我有一個不錯的主意。)這是我想通這個機制工作它出來,閱讀源代碼導軌:
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
因此,我們可以追捕中軌/ railties/lib中/導軌/應用/ configuration.rb Application::Configuration
。
但是,這是一個相當小的類,沒有任何東西允許調用任意方法。讓我們上鍊。這是::Rails::Engine::Configuration
的孩子,讓我們來看看這個文件。 (如果你正確地遵循,rails/railties/lib/rails/engine/configuration.rb)。
再次,一個相當小的類與定義的功能集。但是,這也有一個父類! ::Rails::Railtie::Configuration
。所以,我們看一下這個文件(軌道/ railties/lib中/導軌/ railtie /配置)來源:
,右有在最後,我們有日益流行的#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
閱讀本,我們看到名稱是否包含=
,我們將類變量選項哈希值設置爲等於第一個參數,並使用您稱爲鍵的方法的名稱(在表示它之後)。否則,我們會返回選項散列中該密鑰的內容。但是,因爲它以這種方式工作,所以#methods
或#instance_variables
都不起作用。然而,再次,閱讀這個文件,我們可以看到鐵軌給了我們一個選項:
def respond_to?(name)
super || @@options.key?(name.to_sym)
end
如果該鍵已設置這將返回true。
爲了得到一個列表,你可以:
MyApp::Application.config.class_variable_get(:@@options).keys
,這將給你在選項類變量
謝謝鍵列表!它可以通過'MyApp :: Application.config.class_eval {class_variable_get:@@ options}'完美地工作 –