WeBlog

Webに関する情報を中心に発信してるブログ

【 Rails 】Routingの定義の色々

ルーティングの定義ってresourceresourcesscopenamespaceなどなどルーティング1つとってもどんだけあるねんって感じですね。

しかもネストするとかもあるし意味不明すぎる。

とりあえずresource、resourcesは基礎的なとこなので、この2つについて試したので結果を書いてみる。

単数系のresourceを使ってみた

単数系のresourceで書くとパスに:idがない。

indexアクションもなくなりました。

resource :boardと単数系にしているが、コントローラはboards#newのようにboardsと複数形になっている。

コントローラ名はBoardsControllerのように複数形なので、boards#newのように複数形になる。

単純なページへのルーティングのように、idが不要な場合は単数形のresourceを指定することができる。

# ルーティング
resource :board

new_board    GET          /board/new(.:format)               boards#new
edit_board     GET         /board/edit(.:format)                boards#edit
board              GET         /board(.:format)                         boards#show
                          PATCH   /board(.:format)                         boards#update
                         PUT         /board(.:format)                         boards#update
                         DELETE /board(.:format)                          boards#destroy
                         POST    /board(.:format)                            boards#create

複数形のresourcesを使ってみた

複数形のresourcesで書くと:idがある。

パスにidが含まれ、indexアクションも含んだ7つの基本的なルーティングができる。

コントローラはboards#indexのように複数形になっている。

# ルーティング
resources :boards

boards                      GET    /boards(.:format)                      boards#index
                                   POST   /boards(.:format)                      boards#create
new_board             GET    /boards/new(.:format)                  boards#new
edit_board              GET    /boards/:id/edit(.:format)             boards#edit
board                       GET    /boards/:id(.:format)                  boards#show
                      PATCH  /boards/:id(.:format)                  boards#update
                                  PUT    /boards/:id(.:format)                  boards#update
                                  DELETE /boards/:id(.:format)                  boards#destroy

どちらもresourcesで複数系にして、ネストしてみた

どちらもresourcesで複数系にして、ネストしてみた。

掲示板は複数あるのでresources :boardsと複数形にする。

掲示板にコメントも複数あるので、resources :commentsと複数形にする。

パスには当然idが含まれて、/boards/:board_id/comment/:idのように掲示板のidとコメントのidの2つのidがつく。

resources :boards do
    resources :comments
end

# ルーティングの表
board_comments              GET    /boards/:board_id/comments(.:format)                    comments#index
                                                POST   /boards/:board_id/comments(.:format)                    comments#create
new_board_comment     GET    /boards/:board_id/comments/new(.:format)                comments#new
edit_board_comment      GET    /boards/:board_id/comments/:id/edit(.:format)           comments#edit
board_comment                GET    /boards/:board_id/comments/:id(.:format)                comments#show
                                                PATCH  /boards/:board_id/comments/:id(.:format)                comments#update
                                                PUT    /boards/:board_id/comments/:id(.:format)                comments#update
                                                DELETE /boards/:board_id/comments/:id(.:format)                comments#destroy

boards                                  GET    /boards(.:format)                                       boards#index
                                               POST   /boards(.:format)                                       boards#create
new_board                         GET    /boards/new(.:format)                                   boards#new
edit_board                          GET    /boards/:id/edit(.:format)                              boards#edit
board                                   GET    /boards/:id(.:format)                                   boards#show
                                              PATCH  /boards/:id(.:format)                                   boards#update
                                              PUT    /boards/:id(.:format)                                   boards#update
                                              DELETE /boards/:id(.:format)                                   boards#destroy

どちらもresourcesで複数系にして、ネストしたルーティングにshallow: trueオプションをつけてみた。

どちらもresourcesで複数系にして、ネストしたルーティングにshallow: trueオプションをつけてみた。

comments#edit、comments#show、comments#update、comments#destroyのパスが簡素化されていることがわかる。

comments#indexアクションは「コメント一覧画面を表示する」ためのアクションです。

comments#newアクションは「コメントを投稿する画面を表示する」ためのアクションです。

comments#createアクションは「コメントを新規投稿する機能」を持つアクションです。

この3つのアクションでは、/:board_id/のようにどの掲示板に対してのコメントなのかわからないといけないので、掲示板のidが必要です。

どの掲示板に対するコメントを一覧で表示するのか?どの掲示板に対してコメントを新規作成するのか?という情報が必要ということです。

それに対して、

comments#edit、comments#show、comments#update、comments#destroyアクションは、既にDB上に存在する過去にされたコメントを詳細表示したり、変更したり、削除するアクションです。

これらはDB上で掲示板に紐づいているものなので、どのidのコメントなのかがわかれば済む処理です。

なので/:board_id/の情報は必要ないので簡素化されます。

resources :boards do
    resources :comments, shallow: true
end

board_comments                       GET    /boards/:board_id/comments(.:format)               comments#index
                                                         POST   /boards/:board_id/comments(.:format)               comments#create
new_board_comment               GET    /boards/:board_id/comments/new(.:format)           comments#new
edit_comment                             GET    /comments/:id/edit(.:format)                       comments#edit
comment                                       GET    /comments/:id(.:format)                            comments#show
                                                         PATCH  /comments/:id(.:format)                            comments#update
                                                         PUT    /comments/:id(.:format)                            comments#update
                                                         DELETE /comments/:id(.:format)                            comments#destroy

boards                                           GET    /boards(.:format)                                  boards#index
                                                         POST   /boards(.:format)                                  boards#create
new_board                                   GET    /boards/new(.:format)                              boards#new
edit_board                                    GET    /boards/:id/edit(.:format)                         boards#edit
board                                             GET    /boards/:id(.:format)                              boards#show
                                                        PATCH  /boards/:id(.:format)                              boards#update
                                                        PUT    /boards/:id(.:format)                              boards#update
                                                        DELETE /boards/:id(.:format)                              boards#destroy

複数形のresourcesと単数系のresorceを組み合わせてみた

複数形のresourcesと単数系のresorceを組み合わせてみる。

boardsには/boards/:board_idのようにidがあるが、commentには:idがないです。

resources :boards do
    resource :comment
end

new_board_comment              GET    /boards/:board_id/comment/new(.:format)          comments#new
edit_board_comment               GET    /boards/:board_id/comment/edit(.:format)         comments#edit
board_comment                         GET    /boards/:board_id/comment(.:format)              comments#show
                                                         PATCH  /boards/:board_id/comment(.:format)              comments#update
                                                         PUT    /boards/:board_id/comment(.:format)              comments#update
                                                         DELETE /boards/:board_id/comment(.:format)              comments#destroy
                                                         POST   /boards/:board_id/comment(.:format)              comments#create

boards                                           GET    /boards(.:format)                                boards#index
                                                         POST   /boards(.:format)                                boards#create
new_board                                   GET    /boards/new(.:format)                            boards#new
edit_board                                    GET    /boards/:id/edit(.:format)                       boards#edit
board                                              GET    /boards/:id(.:format)                            boards#show
                                                         PATCH  /boards/:id(.:format)                            boards#update
                                                         PUT    /boards/:id(.:format)                            boards#update
                                                         DELETE /boards/:id(.:format)                            boards#destroy

ブラウザでhttp://localhost:3000/rails/info/routesを入力すると、ルーティングの表を見ることができる。

https://techracho.bpsinc.jp/baba/2020_11_20/15619