Railsで定数ってどこに書いたらいいの?

っていう質問がありました。以下は Rails 2.3.5 対応コードです。

config/initializers/00_load_config.rb

AppConfig = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")[RAILS_ENV].symbolize_keys

としておいて、

config/settings.yml

development:
  email: "development@example.com"

test:
  email: "test@example.com"

production:
  email: "production@example.com"

などとしておけば、

モデルやコントローラーやビューなどで、

  AppConfig[:email]

でアクセス出来ます。

YAMLを使った方が、Rubyコードで直接書くより、環境毎に切り替えられて便利ですね。


config/initializers/ 以下におくより、config/preinitializer.rb に書いた方が良いのでは?という意見もあると思います。それもできるのですが、Railsの実行順の関係でちょっと冗長になります。

config/preinitializer.rb

require 'yaml'
AppConfig = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")[ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"].inject({}) do |options, (key, value)|
  options[(key.to_sym rescue key) || key] = value
  options
end

yamlがrequireされていない、RAILS_ENVが設定されていない、ハッシュに symbolize_keys メソッドが追加されていない、という点を考慮しないといけません。
また、script/server -e production ではなく、RAILS_ENV=production script/server というふうに起動する必要があります。めんどくさいですね。
というわけで、config/initializers/ 以下で1番目に実行されるようにしておくのをオススメします。


※追記
configatron って gem が人気あるので、そっちの方がいいかも!ググったら日本語の記事もいっぱいあるので、ここでは解説しないよ。


それでは、楽しいRails開発を!

twitter で無償 Rails サポートボランティアをやっています。"Rails" という単語で監視していますので、つぶやくと、解決方法を知っている場合は reply 致します。24時間監視はできませんので、なんらかの返事が欲しい場合は、直接 @babie までメッセージを下さい。また、動作確認・保証は行いませんのでご了承ください。