2008-11-17 Railsで作るTwitterもどき(2)
■[Rails] Railsで作るTwitterもどき (URL設計編)
でモデルができたので、今回はURL設計について考えてみようと思う。
http://twitter.com/ユーザID みたいなURLにアクセスすると、その人の発言が読める、というのを実現するために考えておく。
TwitterのURLを眺めてみて、URLとアクションの関係は以下のようなことになってる事が分かった。
ドメイン以下のパス | アクション | 要ログイン |
---|---|---|
/home | 自分のホーム。発言可能 | ○ |
/friends | 自分がフォローしている相手の一覧 | ○ |
/followers | 自分をフォローしている相手の一覧 | ○ |
/public_timeline | みんなの発言一覧 | × |
/ユーザID | その人の発言一覧 | × |
/ユーザID/friends | その人がフォローしている相手の一覧 | ○ |
/ユーザID/followers | その人をフォローしている相手の一覧 | ○ |
/ユーザID/status/ID | その人の発言(個別) | × |
/ユーザID/favourites | その人のお気に入り一覧 | × |
これを見て分かる事は、home, friends, followers, public_timelineは、予約語的になっていて、ユーザIDとして使えないということ。ログイン前にこれらのURLを直打ちすると、ログイン画面に飛ばされる。
ということで、この通りのURLが使えるようにしてみる(こちらは、つぶやきモデルをTweetにしちゃったので、若干その辺違うけど)。
config/routes.rbを編集する。
ActionController::Routing::Routes.draw do |map| map.resources :users map.resource :session # 中略 map.signup '/signup', :controller => 'users', :action => 'new' map.login '/login', :controller => 'sessions', :action => 'new' map.logout '/logout', :controller => 'sessions', :action => 'destroy' # 以下を追加 map.home 'home', :controller => 'members', :action => 'home' map.friends 'friends', :controller => 'members', :action => 'friends' map.followers 'followers', :controller => 'members', :action => 'followers' map.timeline 'public_timeline', :controller => 'tweets', :action => 'list' map.connect ':user', :controller => 'members', :action => 'show' map.connect ':user/friends', :controller => 'members', :action => 'friends' map.connect ':user/followers', :controller => 'members', :action => 'followers' map.connect ':user/tweet/:id', :controller => 'tweets', :action => 'show' map.connect ':user/favorites', :controller => 'tweets', :action => 'favorites' map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' end
最初の二つは、restful_authenticationプラグインが付加したもの(map.resourceの設定)。
最後の二つは、デフォルトで定義されるもの。
はじめに特別なURLである、home, friends, followers, public_timeline を定義する。これらは名前付きrouteにしておいた。それぞれ home_path, friends_path, followers_path timeline_path とするとURLに展開される。
次にユーザIDが入るようなrouteを定義する。ユーザIDの部分は ":user" と書いておく事で、コントローラから params[:user] で引き出せるようになる。
ちなみに、/login, /logout, /signup などのURLを使いたい場合には、これらの指定より上に書いておかなければいけない。
それと、ここではroutes の指定と一緒に、コントローラ名とアクションもおおまかに決めてしまった。
コントローラは、ユーザにまつわる処理を行う Membersコントローラ(Usersは、ユーザ登録に使うので使用不可)と、つぶやき関連の表示を担うTweetsコントローラの二つにした。
例えば、Membersコントローラの homeアクションで、自分のホームを表示するための処理を行う。
$ rake routes
と打てば、設定したroutesの一覧が確認できるはずだ。