routes.rbでURLを丸ごとパラメータとして渡す記述法
This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/32
Ruby on Railsでは、URLのマッピングに関する情報を routes.rbファイルに記述します。これを記述する際に、URLを丸ごとパラメータとして渡したい事があります。例えば、はてなブックマークでは、特定のURLに関するエントリーの情報を参照するためのURLは、こんな感じになります:
http://b.hatena.ne.jp/entry/http://foo.bar.com/
これがdel.icio.usの場合、URLを直接指定するのではなく、md5を使ったダイジェストを渡すようになっています。URLの規格としては後者の方が正しいアプローチなのですが、アドレス記入欄にURLを手入力する場合や、グリースモンキーから利用する場合を考えると、md5を使わずに済んで楽なので、前者の方法も捨てがたいわけです。
では、これと同じ事をRailsでやるにはどうしたら良いでしょうか。単純に考えると、routes.rbファイルに;
map.connect 'entry/:url', :controller => 'entry', :action => :list
という感じに書けば良さそうです。しかし、実際にこのコードを実行してみると、URLに含まれる'/'がデリミタだと見なされてしまうため、うまく認識してくれません。
最後の'/'より後に続く部分をまとめてパラメータとして捕捉するためには、下記のように記述する必要があります。
map.connect 'entry/*url', :controller => 'entry', :action => :list
こうする事で、params[:url] には ActionController::Routing::PathComponent::Result オブジェクトが渡されます。このオブジェクトの実体は、デリミタ'/'で区切られたパートを保持する配列です。また、to_sメソッドを呼び出す事で、元のURLを再現できるようになっているので、
url = params[:url].to_s
とすると、パラメータとしてURLを丸ごと渡す事ができます。
This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/32