2013-10-06 28 views
0

使用Rails 3.2。我有以下幾點:DRYer application.yml for site-wide常量

# application.rb 
APP_CONFIG = YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))[Rails.env] 

# application.yml 
development: &non_production_settings 
    site_url: http://goodboy.com 
    site_name_lowercase: good boy 
    site_name_titleize: Good Boy 

production: 
    site_url: http://goodboy.com 
    site_name_lowercase: good boy 
    site_name_titleize: Good Boy 

首先,我想設置一個站點範圍的配置,但它無法找到常數:

site_name_lowercase: good boy 
site_name_titleize: Good Boy 

development: &non_production_settings 
    site_url: http://goodboy.development 

production: 
    site_url: http://goodboy.com 

其次,我知道這是一個YAML文件,但反正是有,我使用Rails的方法是這樣的:

site_name_lowercase: good boy 
site_name_titleize: site_name_lowercase.titleize 

回答

1

勝利者,請看看到YAML是如何工作的,你可以用它做什麼。從你所問的問題我可以看出,這對你來說是件好事。

閱讀規範總是件好事。對於YAML那些實際上是非常出色和可讀性:http://www.yaml.org/spec/1.2/spec.html#id2708649

爲您解答:

首先,如果我理解正確的話,你想有一個與環境無關的YAML文件全局配置選項。在你的情況下,它是site_name_lowercasesite_name_titleize。這兩個鍵都在你的YAML文件的頂層,所以完全沒有範圍。

如果你看一下,你正在使用此代碼:

YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__)))[Rails.env] 

很顯然,這種方法不能在所有的工作,因爲它需要的配置與Rails.env的範圍。 所以對於這個問題一個非常簡單的解決辦法是把你的全局配置下的關鍵global

global: 
    site_name_lowercase: good boy 
    site_name_titleize: Good Boy 

development: &non_production_settings 
    site_url: http://goodboy.development 

production: 
    site_url: http://goodboy.com 

,只是使用它:

document = YAML.load(File.read(File.expand_path('../app_config.yml', __FILE__))) 
APP_CONFIG = document[Rails.env].merge(document['global']) 

回答你的第二個問題,不,它不是可以在YAML中編寫Ruby代碼。

你可以在rails中做的是在YAML文件中使用ERB標籤來評估內容。也可以將對象調入YAML。這可能不是你想要的。

對你而言,我不認爲這種方法有任何意義。這不是推廣事物的好地方。如果你真的認爲這是值得的,你可以編寫一個輔助方法來創建一個標題化版本並在代碼中使用它。