【Rails】基本的なルーティングの書き方、ネスト・resourcesについても解説
こんにちは!
web系エンジニアを目指して学習中のsiと申します^ ^
この記事の対象者
- Railsのルーティングって何?って方
- resourcesを使用したルーティングの書き方を知りたい方
- ネストを使用したルーティングの書き方を知りたい方
今回の記事では、ルーティングの書き方について、
基本的な書き方に加え、resources・ネストを使用した書き方について解説していきます!
目次
ルーティングとは
Railsにおけるルーティングの役割とはユーザーから送られたHTTPリクエストとURLを元に、
config/routes.rbの中のルーティングを確認して、どのコントローラーのどのアクションを実行するか決定することです。
また、HTTPリクエストとRailsの7つのアクションについては、
こちらの過去記事でも説明しているのでぜひ参考にしてみたください^ ^
基本的な書き方
GET,POST,PATCH,DELETEを使った書き方
基本的にはこのように、1つ1つのアクションに対して、
HTTPリクエストとURLを記載してどのコントローラーのどのアクションを指定するのか記載します。
# HTTPリクエスト URL コントローラー名#アクション名
post "posts" => "posts#create"
get "posts/new" => "posts#new"
get "posts/:id/edit" => "posts#edit"
get "posts/:id" => "posts#show"
patch "posts/:id" => "posts#update"
delete "posts/:id" => "posts#destroy"
また、「newアクション」と「showアクション」記載する順番に関しては、注意が必要になります。
コードは上から順番に読み込まれるため、「newアクション」より上に「showアクション」を書いてしまうと、
posts/newにアクセスしたつもりが、posts/:idに反応してしまうため、上手くアクセス出来なくなります。
そのため、newアクションとshowアクションを書く順番には注意しましょう!
rootURLの書き方
※rootにindexアクションを指定する場合
root "posts#index"
rootとはいわゆるトップページのことです。
URLで言うとドメイン名の後ろに何もついていない状態のものがrootURLにあたります。
当ブログで言うと、https://programming-i.net/がrootURLになります。
実際に7つのアクションをconfig/routes.rbに書いてみる
※indexアクションはrootで記載
#app/config/routes.rb
Rails.application.routes.draw do
root "posts#index"
post "posts" => "posts#create"
get "posts/new" => "posts#new"
get "posts/:id/edit" => "posts#edit"
get "posts/:id" => "posts#show"
patch "posts/:id" => "posts#update"
delete "posts/:id" => "posts#destroy"
end
resourcesを使った書き方
下記にように「resources」を使うと基本的な書き方に比べて、
少ないコード量でルーティングを書くことが出来ます。
resources :posts
このように書くことで7つのアクションを全て記載したことと同じになります。
これを基本的な書き方で書いた場合、このようになります。
get "posts" => "posts#index"
post "posts" => "posts#create"
get "posts/new" => "posts#new"
get "posts/:id/edit" => "posts#edit"
get "posts/:id" => "posts#show"
patch "posts/:id" => "posts#update"
delete "posts/:id" => "posts#destroy"
コード量の違いが一目瞭然ですね!
resourcesを使うと書く量がだいぶ減るのでとても便利です^ ^
resourcesとresourceの違い
resourcesに似たもので、resourceというものもあります。
使い方の違いは名前を見れば分かる通り、
対象のリソースが単数の場合はresourceを使用し、複数の場合はresourcesを使用する、
という使い分けになります。
例として、単数リソースの「sun」と複数リソースの「planets」をルーティングを書いてみます
resources :planets
resource :sun
シェルでrails routesを実行してルーティングを確認してみます
planetsとsunを比べると、sunの方にはindexアクションが無く、「id」がURLの中に含まれていません。
sunは単数なので一覧を表示する必要が無く、idでリソースを指定する必要も無いためです^ ^
ネストを使った書き方
まずは、ネストを記述しない方法だとどうなるのか見てみます。
ネストを記述しない場合
routes.rbにこのように記述する
#app/config/routes.rb
Rails.application.routes.draw do
resources :post
resources :comment
end
この時のルーティングがどうなっているか確認する
このように、「post」と「comment」のルーティングが別々で表示される。
次にネストを記述する場合について見てみます
ネストを記述する場合
routes.rbにこのように記述する
Rails.application.routes.draw do
resources :post do
resources :comment
end
end
この時のルーティングがどうなっているか確認する
ネストしない場合と異なり、
/post/:post_id/comment(.:format)
のように「post」と「comment」が同じURLの中に含まれている。
※ネストは2回以上行うと、複雑になりルーティングが扱いにくくなるので、
1回までに留めておくことをオススメします^ ^
まとめ
- ルーティングには、どのコントローラのどのアクションを実行するのか、決定する役割がある
- resourcesを使えば少ないコード量で基本的なアクションを記述出来る
- resourcesの他に、単数系リソースを取り扱うためのresourceという書き方もある
- ネストをすることでURLの階層構造が出来て、リソース同士の関係性を把握出来る