I ran into this sort-of bug while using Memcached and Rails. By caching an object in memcache, Rails doesn't know how to autoload the file that defines its class and throws an Undefined Module / Class error.
Thankfully Phil posted a helpful solution to this, and my variation of it is this:
1 class ApplicationController < ActionController::Base 2 protect_from_forgery 3 before_filter :preload_modules 4 5 def preload_modules 6 unless Rails.env.production? 7 load "#{Rails.root}/app/models/accounts/account_base.rb" 8 load "#{Rails.root}/app/models/accounts/account.rb" 9 [ "app/models/accounts" ].each do |path| 10 Dir["{Rails.root}/{path}/*.rb"].each do |file| 11 load file 12 end 13 end 14 Account 15 Asset 16 Liability 17 Expense 18 Revenue 19 Other 20 Equity 21 BankAccount 22 CreditCard 23 Company 24 Customer 25 Vendor 26 CurrentAsset 27 end 28 end 29 end
Cool, huh? This is from Regdel, the open source bookkeeping app powered by Ruby and Ruby on Rails.
The code doesn't get evaluated in production because at this point I'm only caching objects that get reloaded when the classes are not cached. In the future, I might cache additional objects, but I don't know if I'll need to include the above, because again, the classes will get cached, and won't need to be autoloaded everytime.
UPDATE: I have confirmed that this is not necessary on production for my setup. I plan to research the use of memcache and Rails 3.1 more in the near future.