web系エンジニアを目指す私、siが学習のアウトプットをメインにプログラミングについての記事を書いていきます。

【Rails】基本的なルーティングの書き方、ネスト・resourcesについても解説

 
この記事を書いている人 - WRITER -

 

こんにちは!

web系エンジニアを目指して学習中のsiと申します^ ^

 

この記事の対象者

  • Railsのルーティングって何?って方
  • resourcesを使用したルーティングの書き方を知りたい方
  • ネストを使用したルーティングの書き方を知りたい方

 

今回の記事では、ルーティングの書き方について、

基本的な書き方に加え、resources・ネストを使用した書き方について解説していきます!

 

ルーティングとは

 

Railsにおけるルーティングの役割とはユーザーから送られたHTTPリクエストとURLを元に、

config/routes.rbの中のルーティングを確認して、どのコントローラーのどのアクションを実行するか決定することです。

 

また、HTTPリクエストとRailsの7つのアクションについては、

こちらの過去記事でも説明しているのでぜひ参考にしてみたください^ ^

【Rails】HTTPリクエストと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の階層構造が出来て、リソース同士の関係性を把握出来る

 

 

 

この記事を書いている人 - WRITER -

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Copyright© .i DO WHAT I WANT , 2021 All Rights Reserved.