trans_sidが名前付きルートで使えないケーーーーーン!

懐かしいですね、パチスロ北斗の拳。私は初代で39連が最高です。しょぼいですね。
それはそうと、rails2.0+jpmobileという環境でtrans_sidが効かない状況があるケーーーーーン!に5時間ほど嵌ったのでお知らせします。その状況とは、controllerとactionに縛りがある名前付きルート(named route)のヘルパを引数なしで呼んだ時でした。その原因が分かるまでの過程は置いといて、私の回避策はenvironment.rbにて

Rails::Initializer.run do |config|
  config.action_controller.optimise_named_routes = false
end

なんでも、Routing Optimisationとかいう、やけに凝った仕組みでもってコストのかかるパス構築の手続きを最適化しているらしい。よけいなお世話だっつーの!ルーティング周りのソースは本当に泥沼だね。
おまけ。自動生成される問題のコード。

map.login  '/login',  :controller => 'session', :action => 'new'

のような名前付きルートに対して

def login_path(*args)
  return "#{ request.relative_url_root if request.relative_url_root}/login" if defined?(request) && request && args.size == 0

  opts = if args.empty? || Hash === args.first
           args.first || { }
         else
           options = args.last.is_a?(Hash) ? args.pop : { }
           args = args.zip([]).inject({ }) do |h, (v, k)|
             h[k] = v
             h
           end
           options.merge(args)
         end

  url_for(hash_for_login_path(opts))
end

さー帰ってビール飲もう。

追記: optimise_named_routes という言葉を知って見つけた同志

http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20080124#p03

追記: その他、気をつけましょう

デフォルトルートの定義にて

map.root :controller => "front", :action => :top

acts_as_authenticatedと一緒に

redirect_back_or_default '/'

何がまずいか分かるかな?