読者です 読者をやめる 読者になる 読者になる

undefined class/module とか言われてアプリの起動ができなくなってしまう

ruby rails

このアプリの環境はRails-2.3.17、memcachedjpmobileなのですが、
あるコントローラを踏むとこんな状態になってしまって困っていました。

ArgumentError (undefined class/module Mail):
  

Rendered rescues/_trace (34.9ms)
Rendered rescues/_request_and_response (0.9ms)
Rendering rescues/layout (internal_server_error)
/!\ FAILSAFE /!\  Sat Feb 23 02:52:33 +0900 2013
  Status: 500 Internal Server Error
  undefined class/module Mail
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/activesupport-2.3.17/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:211:in `load'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/activesupport-2.3.17/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:211:in `get'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/activesupport-2.3.17/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:828:in `with_server'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/activesupport-2.3.17/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:207:in `get'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/actionpack-2.3.17/lib/action_controller/session/mem_cache_store.rb:31:in `get_session'
    /Users/fujioka/rails/you-ok/vendor/plugins/jpmobile/lib/jpmobile/trans_sid.rb:16:in `load_session'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/actionpack-2.3.17/lib/action_controller/session/abstract_store.rb:132:in `send'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/actionpack-2.3.17/lib/action_controller/session/abstract_store.rb:132:in `load!'
    /Users/fujioka/.rbenv/versions/ree-1.8.7-2012.02/gemsets/you-ok-gemset/gems/actionpack-2.3.17/lib/action_controller/session/abstract_store.rb:187:in `send'

しかも、なぜ起こるのかさっぱりわからず。
ようやく昨日わかりました。それによると、
memcachedへのMarshalの不具合のようで、
セッションをmemcachedからMarshalロードするときに
Classの定義を見つけられないらしい。
https://github.com/mperham/dalli/issues/227
似たような状態の人がDalliにいました。
 
私の解決策は、config/environments/development.rbで
config.cache_classes = false

config.cache_classes = true
にするとうまくいくようになりました。
 
http://www.ruby-forum.com/topic/1497937
には私と全く同じ状況の人もいました。
 
なんかMarshalと相性が悪いんですね。