Railsで URL Shortenerを作ってみた(3/3)

前回までの状況では、表示される短縮形のリンクは以下のようになっている。

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/0mUWXNhttp://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を使えば簡単に書ける事がわかったので、もうちょっと色々作ってみようかと思う。