yamazのRails日記 このページをアンテナに追加 RSSフィード

2007-12-02reloadableではまった話 このエントリーを含むブックマーク

アプリケーションの設定をモデル+environment.rbでやろうと思って下記のコードを書いた

# app/models/app_config.rb
class AppConfig
  cattr_accessor :production_servers, :test_servers
end

# config/environment.rb
AppConfig.production_servers = %w(test01 test02)

でもアプリケーションからAppConfig.production_serversを参照してもなぜかnil.

おかしいと思って悩んでたらくまくまの人から


「それ,reloadbleのせい」


と教えてもらった.RailsにはReloadableというモジュールがあって,

これが組み込まれているクラスはdevelopment環境においては

アクセスがあるたびに再評価される.つまり


  1. app/models以下はReloadableだよ。
  2. environment.rbはmongrelなどが立ち上がった時に一回だけ評価されるよ
  3. よって2回目以降にアクセスした場合,Reloadableモジュールによってクラスが再評価されて,environment.rbでセットしたクラス変数はかき消されてしまうよ.

ということらしい.よって解決方法はいくつかあって,


  1. developmentは他にもいろいろトラブルを起こす要素があるので,開発もproductionで(くまくま方式)
  2. reloadableにならないところ(たとえばplugin化してvendor/plugins以下)におこうよ(プラグイン方式)
  3. その他

どなたかほかに方法があったら教えてください.

(おしまい)

babiebabie2009/02/06 23:05config/initializers/ の下に置いたらいいと思います。

yamazyamaz2009/02/06 23:38おぉ.なるほど!

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20071202