前回までの状況では、表示される短縮形のリンクは以下のようになっている。
http://0.0.0.0:3000/urlpairs/0mUWXN
これを開こうとしても Unknown actionではねられてしまう。
これを解決する。やることは3つ。
- 有効な短縮URLが見つかったら対応するURLへリダイレクトするアクション (jump)を設ける。見つからなかったら登録画面へリダイレクトする。
- ルートパスを設定する。
- 上記のようなURLに対して jumpの機能を実行するようにルーティングを変更する。
jumpアクションの追加
まず jumpアクションの追加。find_by_surlで短縮URLに対応するペアを探す。見つかったらそのURLへリダイレクトする。見つからなかったら index画面へリダイレクトする。
def jump @urlpair = Urlpair.find_by_surl(params[:id]) if @urlpair redirect_to(@urlpair.url) else redirect_to :action=>'index' end end
これで http://0.0.0.0:3000/urlpairs/jump/0mUWXN から対応するWebページにリダイレクトするようになる。
ルートパスの設定
次に http://0.0.0.0:3000/ をルートパスとし、これと urlpairsのindexアクションを対応させる。
config/routes.rbに以下を追加。このとき public/index.htmlを削除するのを忘れずに。
map.root :controller => 'urlpairs'
これで http://0.0.0.0:3000/ でURL登録画面が表示される。ルーティングを変更したらサーバの再起動が必要。
次は http://0.0.0.0:3000/0mUWXN を http://0.0.0.0:3000/urlpairs/jump/0mUWXN と等価にするためのルーティングを追加する。
map.connect ':id', :controller => 'urlpairs', :action => 'jump'
結局、config/routes.rbは全部で以下のようになる。
ActionController::Routing::Routes.draw do |map| map.root :controller => 'urlpairs' map.connect ':id', :controller=>'urlpairs', :action=>'jump' map.connect ':controller/:action/:id' end
これでリダイレクトは所望の動作をするようになった。
最後に、リンクのURLを短縮名でなくちゃんとしたURLとして表示させるようにする。それには app/views/urlpairs/create.rjsを一行変更するだけでいい。
shortURL = 'http://' + request.host_with_port + root_path + @urlpair.surl
request.host_with_portはリクエストを行ったホスト名とポート番号のペア、root_path は route.rbで定義した map.rootの示すパス。これらを組み合わせることで正式な短縮 URLができる。
おわり
こうやって書き直してみたら全然大した処理はしてないし、ここに書かれていない試行錯誤は何だったのかと考えさせられる。やっぱり記録を書くことは大事。この程度のアプリならRailsを使えば簡単に書ける事がわかったので、もうちょっと色々作ってみようかと思う。