Railsで任意のパスをひとつのControllerで受け付ける
Railsの構成技術の一つにURLマッピング機能というか、map.connectやらmap.resouceというか、
config/routes.rb
がある。これはStrutsでいうところのStruts-configや、J2EEでいうところのweb.xmlが担っていたURLを特定のプログラムにマッピングする機能を提供するもので、その簡潔で直感的な記述方法や自由度の高さCoCのしやすさからRailsを特徴づけるとても強力な仕掛けだと思う。
今回「任意のパスをひとつのプログラムで受け付ける」という要件を実装すべく色々調べていたのだが、なかなか情報が見つからなかった。まあ、そんなことしたがる人はあんまりいないかも知れないけどねぇ・・ コンテンツフィルタとかを実装する場合はこれが出来るかどうかは結構重要なわけで・・
あぁRailsではそういうことは出来ないのか・・?という疑いに心が支配されそうになったとき、やり方、やっと見つけたので、ここに記しておく。(調べ方が悪かっただけかもだけどさw)
こたえ:
*(アスタリスク)を以下のように使うらしい。
map.connect '*path', :controller => "test", :action => "test"
上記のようにかけば、任意のパスへのリクエストがTestController#testに飛んでくる。
そんで、そのTestController#testでこんな風にかいて、
def test p params[:path] p request.env_table["REQUEST_URI"] end
GET /foo/bar?piyo=hiyo なんてリクエストをすると、
["foo","bar"] http://example.com/foo/bar?piyo=hiyo
なんて感じで帰ってくる・・と。フムフム・・