Twitterもどき monologue 作成の続き。
id:NeoCat:20080525:1211709039 でconfig/routes.rb を使ってデフォルトコントローラを指定しましたが、もう少し詳しく指定して、短いURLでリソースにアクセスできるようにしてみます。例えば、これまでユーザの情報ページは、 /user/index/ユーザ名 とする必要がありましたが、 /ユーザ名 としてみます。
詳しく書くと、
URL | リソース |
---|---|
/ | user/indexにリダイレクト |
/home | ログイン中のユーザのhome |
/login, /logout, /signup | accountのログイン、ログアウト、サインアップ |
/status/new/〜, /user/editなど | railsのデフォルトの動作 |
上記以外の /ユーザ名 | ユーザの情報ページ |
上記をそのままconfig/routes.rbファイルに記述します。上の方が優先度が高くなります。
# default controller map.connect '', :controller => "user" # direct recources access map.connect 'home', :controller => "user", :action => "home" map.connect 'login', :controller => "account", :action => "login" map.connect 'logout', :controller => "account", :action => "logout" map.connect 'signup', :controller => "account", :action => "signup" # default routes map.connect ':controller/:action/:id.:format' map.connect ':controller/:action/:id' # direct access to user info map.connect ':id', :controller => "user"
この設定を行うと、これまで作った link_to などのメソッドによるリンク先も、自動的に短いURLに短縮されてしまいます。これはすごい!
ただし、上記のルールと重複するユーザ名、例えば home というユーザ名の情報ページにはアクセスできなくなります。そこで、signup時にこれらの重複する名前ははじくようにしておきます。
下記のチェックを app/controllers/account_controller.rb のsignupメソッドの先頭に加えます。(本当はvalidationで書くべき?)
def signup @user = User.new(params[:user]) if ['user', 'follow', 'status', 'account', 'index', 'home', 'login', 'logout', 'signup'].member? @user.login flash[:notice] = "指定されたlogin名は使用できません" return end