routesを記述する

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