2013-04-03 56 views
0

我想獲得的所有配置變量,但我不太明白一些關於Rails的配置...如何在Rails應用程序中獲取config vars?

比方說,我有一些像在test.rb config.myvar,並且運行時,我做的:

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

如果我是正確的,我可以認爲它是一個函數,如doc中指定的那樣。然而,撥打methods會給我(很多)的方法,但不是我的... 同instance_variables或任何我可以嘗試。

顯然有一些我錯過了,如果您有任何線索:)

回答

1

我現在沒怎麼當我看到你的問題(雖然我有一個不錯的主意。)這是我想通這個機制工作它出來,閱讀源代碼導軌:

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 

,這將給你在選項類變量

+1

謝謝鍵列表!它可以通過'MyApp :: Application.config.class_eval {class_variable_get:@@ options}'完美地工作 –

相關問題