2.1 リソースのルーティング

リソースを定義する

Railsではリソースを定義することにより、CRUDに対応したURLが自動的に生成されます。それぞれのURLはリソースで定義した名前のコントローラーのアクションにマッピングされます。

postsのリソース

Rails.application.routes.draw do
  resources :posts
end

リソースを定義すると7つのルーティングが作成されます。

メソッド パス コントローラとアクション ヘルパー
GET /posts posts#index posts_path
GET /posts/new posts#new new_post_path
POST /posts posts#create posts_path
GET /posts/:id posts#show post_path(:id)
GET /posts/:id/edit posts#edit edit_post_path(:id)
PATCH/PUT /posts/:id posts#update post_path(:id)
DELETE /posts/:id posts#destroy post_path(:id)

単数のリソースを定義する

単数形のリソースを定義すると、パラメータに:idを伴わない、パスが一定のルーティングが生成されます。

settingのリソース

Rails.application.routes.draw do
  resource :setting
end

生成されるルーティングは以下になります。

メソッド パス コントローラとアクション ヘルパー
GET /setting/new settings#new new_setting_path
POST /setting settings#create setting_path
GET /setting settings#show setting_path
GET /setting/edit settings#edit edit_setting_path
PATCH/PUT /setting settings#update setting_path
DELETE /setting settings#destroy setting_path

単数リソースの場合でも、マッピングされるコントローラは複数形なので注意が必要です。

名前空間を利用する

名前空間を利用することによってコントローラをグルーピングすることができます。

admin名前空間を追加したpostsのリソース

Rails.application.routes.draw do
  namespace :admin do
    resources :posts
  end
end

名前空間を利用してpostsリソースを定義してみると以下のルーティングが生成されます。

メソッド パス コントローラとアクション ヘルパー
GET /admin/posts admin/posts#index admin_posts_path
GET /admin/posts/new admin/posts#new new_admin_post_path
POST /admin/posts admin/posts#create admin_posts_path
GET /admin/posts/:id admin/posts#show admin_post_path(:id)
GET /admin/posts/:id/edit admin/posts#edit edit_admin_post_path(:id)
PATCH/PUT /admin/posts/:id admin/posts#update admin_post_path(:id)
DELETE /admin/posts/:id admin/posts#destroy admin_post_path(:id)

ネストしたリソースを定義する

リソースをネストすることで意味のわかりやすいルーティングにすることができます。

postsリソースの下にcommentsリソースを追加

Rails.application.routes.draw do
  resources :posts do
    resources :comments
  end
end

生成されるルーティングは以下になります。

メソッド パス コントローラとアクション ヘルパー
GET /posts/:post_id/comments comments#index comments_path
GET /posts/:post_id/comments/new comments#new new_comments_path
POST /posts/:post_id/comments comments#create comments_path
GET /posts/:post_id/comments/:id comments#show comment_path(:post_id, :id)
GET /posts/:post_id/comments/:id/edit comments#edit edit_comment_path(:post_id, :id)
PATCH/PUT /posts/:post_id/comments/:id comments#update comment_path(:post_id, :id)
DELETE /posts/:post_id/comments/:id comments#destroy comment_path(:post_id, :id)

ネストしたリソースを簡潔にする

リソースをネストさせる際、:shallowオプションを追加することで、:index, :new, :create以外のアクションの階層を一つ下げて、ルーティングを簡潔に表現することができます。

postsリソースの下に:shallowオプションでcommentsリソースを追加

Rails.application.routes.draw do
  resources :posts, shallow: true do
    resources :comments
  end
end

生成されるルーティングは以下になります。

メソッド パス コントローラとアクション ヘルパー
GET /posts/:post_id/comments comments#index comments_path
GET /posts/:post_id/comments/new comments#new new_comments_path
POST /posts/:post_id/comments comments#create comments_path
GET /comments/:id comments#show comment_path(:id)
GET /comments/:id/edit comments#edit edit_comment_path(:id)
PATCH/PUT /comments/:id comments#update comment_path(:id)
DELETE /comments/:id comments#destroy comment_path(:id)

ルーティングの作成を制限する

リソースに:only, :exceptオプションをつけることで、デフォルトで生成されるルーティングを指定することができます。

postsリソースのindexshowアクションのみを生成

Rails.application.routes.draw do
  resources :posts, only: [:index, :show]
end

生成されるルーティングは以下になります。

メソッド パス コントローラとアクション ヘルパー
GET /posts posts#index posts_path
GET /posts/:id posts#show post_path(:id)

postsリソースのindexshowアクション以外を生成

Rails.application.routes.draw do
  resources :posts, except: [:index, :show]
end

生成されるルーティングは以下になります。

メソッド パス コントローラとアクション ヘルパー
GET /posts/new posts#new new_post_path
POST /posts posts#create posts_path
GET /posts/:id/edit posts#edit edit_post_path(:id)
PATCH/PUT /posts/:id posts#update post_path(:id)
DELETE /posts/:id posts#destroy post_path(:id)

results matching ""

    No results matching ""