2010-04-19 17 views
12

我想知道是否有最佳做法,將全局設置存儲在Rails應用程序中。我的意思是說:我定義了一些可能會改變的全局變量,但不太可能,並且將它們存儲在數據庫中似乎不合適,因爲它們被用得太多了。例如,我有SYSTEM_EMAIL & SYSTEM_EMAIL_SIGNATURE & SYSTEM_STORAGE_ROOT。哪裏是在Rails應用程序中存儲全局變量的最佳地點?

現在我把它們放在environment.rb中,但我不確定這是否是正確的方法來存儲它們。

謝謝

編輯:

接受的答案依然屹立適當,但是我又跳槽到了使用https://github.com/markbates/configatron,還有其他的選擇,但我喜歡configatron最。

回答

15

我最喜歡的技巧之一是將一個包含常量的文件放在目錄config/initializers/(該目錄中的所有文件都會自動加載),但每個不同的Rails環境都有一個部分。例如


case ENV['RAILS_ENV'] 
    when "development" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "staging" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "production" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
end 

如果你想,而不是加載所有的常量在一個大的散列,那麼你可以加載它們作爲一個YAML文件。創建兩個文件,一個叫做config/initializers/email_constants.rb,另一個config/email_constants.yml。在後者的放像:


development: 
    :system_email: ... 
    :system_email_signature: ... 
staging: 
    :system_email: ... 
    system_email_signature: ... 

... etc ... 

然後在config/initializers/email_constants.rb地說:


EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV] 

這會將整個YAML文件和受讓人相應的鍵的值(代表RAILS_ENV),以EMAIL_CONSTANTS

這兩種技術的優點是地方性。您可以將所有與彼此相關的常量(即本例中的電子郵件常量)放在一個文件中。而且,不是將三個不同的文件(每個Rails環境一個文件)分散在同一個常量中,而是將它們全部放在一個文件中。

+0

謝謝肖恩。 我喜歡你最接近 - 除了我不認爲我需要分離到email_constants.yml - 我會保持在contacnts.yml中的一切 – konung 2010-04-20 20:24:29

1

environment.rb是這個地方。您可以將其添加到模塊並將其添加到lib目錄。那麼你可以稱它爲Module :: MY_GLOBAL_VARIABLE。兩者都有優點和薄弱點。在environment.rb是好的,但有時看起來很亂。如果所有這些全局變量都相關,則可以將它們組合在一個模塊中。

2

Rails 3引入了Application對象。即使使用Rails 2,您也可能希望以類似的方式存儲全局變量。

+0

有趣,我開始尋找最近的Rails 3 - 專路線,但沒有讀過別的。我會看看。感謝指針Marc – konung 2010-04-19 21:20:35

10

因爲這些值通常會根據您運行的環境而變化,所以我將全局變量存儲在config/environments/development.rb|production.rb|test.rb中,併爲每個環境提供適當的值。

+0

跨越dev/prod/test的常量應該如何?而不是將它們存儲在所有三個環境中,是否有一個文件適用於所有三種環境? – LikeMaBell 2012-03-21 15:32:56

+0

我自己的評論的答案似乎是/config/environment.rb。有人請糾正我,如果我錯了。對, – LikeMaBell 2012-03-21 15:47:38

+0

是的,就是這樣。 – Ben 2012-03-21 23:21:17

1

我將這樣的配置信息存儲在YML文件中。有關更多詳細信息,請參閱此screen-cast

或者,您可以使用名爲app_config的寶石。

1

通常,當我在做這樣的事情,我有這樣

1的兩種方式 - 如果我的全局變量通用於所有3個環境(開發,測試,生產),那麼我將它存儲在

配置/ environments.rb文件

但可以說,我的價值觀是環境

防爆變化:我的開發環境SYSTEM_STORAGE_ROOT是「/ development_root /」和測試環境SYSTEM_STOR AGE_ROOT是 '/ testing_root /'

那麼我將他們

存儲內部

配置/環境/按照上面的例子

配置/環境/ development.rb將具有 SYSTEM_STORAGE_ROOT = '/ development_root /'

配置/環境/ test.rb將具有 SYSTEM_STORAGE_ROOT = '/ testing_root /'

配置/環境/ production.rb將有 SYSTEM_STORAGE_ROOT = '/ production_root /'

希望這有助於

歡呼聲, sameera

相關問題