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
リソースのindex
とshow
アクションのみを生成
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
リソースのindex
とshow
アクション以外を生成
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) |