Webのルーティング(このURLを指定したらこれが動く・・・)を定義するconfig/routes.rbですがチュートリアルに紹介されている他にも様々な使い方があります。
ルーティングの設定内容はroutes.rbを書き換えるだけで(コントローラやアクションを実装する事なしに)状況を確認できるので気軽に実験できます。
通常、設定内容の確認は
rake routes
で確認できますが、開発環境ではありもしないURLを指定すると現在の設定をブラウザに表示するので、こっちの方が見やすかったりもします。
http://localhost:3000/routes <= “routes”は存在しない
resources / resource
チュートリアルにもあるように
resources :users
を指定するとuserに関する一覧取得から作成・編集・削除のURLパターンを定義してくれます。(上図)
ちなみにここで指定する”resources”ですが、ユーザが複数存在する事が前提です。ユーザが一人しかいない場合や、”ユーザに対する操作対象はログインユーザ(自身)のみ”の場合は単数形の”resource”を使用します。
resource :user
一覧取得(#index)がない事や編集・削除に”id”指定がない事がわかります。
複数形と単数形は併用可能です。
resources :users
resource :user
resouresの入れ子
resourcesの中に別のresourcesを入れ子にする事が可能です。例えばマンションと部屋のようにhas_manyな関係があるとすると、以下のように入れ子にする事もできます。
resources :mansions do
resources :rooms
end
入れ子は何重にも指定可能です。
resources :countries do
resources :prefectures do
resources :cities
end
end
…がURLが必要以上に長くなるので、入れ子は1段階までにとどめておくと良いと思います。
先ほどのマンションの例でも部屋の情報を編集するのにマンションのidを指定するのは少し冗長ですよね、部屋に関してマンションのidが必要になるのは一覧表示(このマンションの部屋一覧)と新規作成の時(このマンションに部屋を追加)ぐらいでしょう。それ以外の場合はユニークな部屋idが割り当てられているので、それのみを指定すれば良いはずです。
そのことを考慮するとresourcesの設定は以下のようになります。
resources :mansions do
resources :rooms, only: [:index, :new, :create]
end
resources :rooms, only: [:show, :edit, :update, :destroy]
この設定はRailsでショートカットが用意されていて以下のように書く事もできます。
resources :mansions, shallow: true do
resources :rooms
end