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 '/'
何がまずいか分かるかな?