Rails 1.2.x でActiveRecordを使わない方法。
RailsでActiveRecordを使いたくない場合、config/environment.rbに
config.frameworks -= [ :active_record ]
と書く方法が以前から紹介されていました*1。……が、これは手元の1.2.6でエラーになります。
どうやら1.2.1からActiveRecordを外せなくなっていたようです。以前書いたRailsアプリケーションを久々に起動して初めて気づきました。
問題になるのは2箇所。rails-1.2.6/lib/initializer.rbの、
- initialize_whiny_nils
- load_observers
の2つのメソッドがActiveRecordに依存しています。
この問題は既に修正されており、以下の修正を1.2.6に加えれば動くようになります(たぶん)。
単純な修正ですが、ソースを書き換えるのは嫌なので、以下のようにしてみました。
config/environments.rb の Rails::Initializer.run ... の前に以下を追加。
if '1.2.1' <= RAILS_GEM_VERSION && RAILS_GEM_VERSION <= '1.2.6' require File.join(File.dirname(__FILE__), 'no_ar_patch.rb') end
以下をconfig/no_ar_patch.rbに保存。
module Rails class Initializer alias :_load_observers :load_observers alias :_initialize_whiny_nils :initialize_whiny_nils def load_observers return unless configuration.frameworks.include?(:active_record) _load_observers end def initialize_whiny_nils if configuration.frameworks.include?(:active_record) _initialize_whiny_nils return end if configuration.whiny_nils NilClass.class_eval do def id raise RuntimeError, "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id", caller end end end end end end
で、ActiveRecordを外しても動くようになりました。
load_observersの方はともかく、whiny_nilsが問題でした。whiny_nilsの機能は2つあって、
- http://moriq.tdiary.net/20050713.html#p03
- nil.idで4を返さない。RuntimeErrorを返す。
- nilのメソッドが呼ばれた時、ActiveRecordかArrayのメソッドっぽかったら、そういうエラーメッセージを出す。
なのですが、ActiveRecord無しの場合は1つ目の機能だけサポートするようにしました。
の冒頭のWHINNERSをrequireされる前に書き換える方法を思いつかなかったので……。