Railsのルーティングで似たような書き方で、全く同じルーティングを指す場合があります。人によって書き方が異なったりするので、初見だと混乱することがあります。
例えば、以下のルーティングは全て、ルートドメイン(例 https://example.com)にアクセスしたときに、Homeコントローラのindexアクションを実行します。
root to: 'home#index'
root 'home#index'
get '/', to: 'home#index'
get 'home/index', action: :index, controller: 'home'
match '/', to: 'home#index', via: 'get'
#リダイレクトする場合
get '/', to: redirect('/home/index', status: 302)
get 'home/index'
また、rootの指定方法をgetに使うとエラーが発生するなど、似ているようでルールが異なります。
ここでは、書き方とそれぞれの違い、実際に使う時の優先順位について解説しています。
(Railsのルーティングは config/routes.rb に記述します)
root
rootはルートドメイン(例 https://example.com)にアクセスしたときに表示するページの指定です。
rootを指定しない場合は、railsのデフォルトページが表示されます。
基本形
root to: 'コントローラ名#アクション名'
省略形
基本形は root to:
ですが、to: を省略することができます。
root 'コントローラ名#アクション名'
実例
/ にアクセスしたときに、Homeコントローラー(home_controller.rb)のindexアクションを実行する処理はいかになります。(どちらも同じです)
root to: 'home#index'
root 'home#index'
rootの注意点
getメソッドでは、get ‘home/inde’ のようにパスを指定することができますが、rootはパスで指定できません。
※パスで指定するとエラーが発生します。
ArgumentError
Missing :controller key on routes definition, please check your routes.
また、rootで指定できるのはGETメソッドのみです。

get
getは指定したパスにGETメソッドでアクセスがあった場合に表示するページを指定します。
基本形
get 'パス', to: 'コントローラ名#アクション名'
ルーティングにおける to:
の扱いはgetやrootなど共通で、'コントローラ名#アクション名'
といった処理がきます。(他にはredirectなど)
省略形
パス = コントローラ名/アクション名 となる場合は、to: 以下を省略することができます。
例えば、コントローラ名#アクション名に home#index を指定する場合は、get 'home/index'
とすることができます。
get 'コントローラ名/アクション名'
アクションをシンボルで指定
アクションとコントローラをそれぞれ個別に指定することもできます。
get 'パス', action: :アクション名, controller: 'コントローラ名'
実例
home/index にアクセスしたときに、Homeコントローラー(home_controller.rb)のindexアクションを実行する処理はいかになります。(どちらも同じです)
get 'home/index', to: 'home#index'
get 'home/index'
get 'home/index', action: :index, controller: 'home'
getの注意点
rootと異なり、getはパスの部分を省略することができません。パスを指定せず、コントローラとアクションだけを指定するとエラーが発生します。
NG: get 'home#index'
OK: get 'home/index'
(※対象のコントローラとアクションがある場合のみ)
コントローラ指定時の注意点
コントローラを指定するときに、コントローラの名前がキャメルケースで複数の単語が繋がっている場合があります(例:ProjectList)。
このとき、ルーティングで指定するコントローラ名はスネークケースで記述します。(例: project_list)
root 'project_list#index'
get 'project/list' to: 'project_list#index'
例:ルーティングにおけるコントローラ名の命名規則
コントローラ名 | ルーティングでの指定 |
---|---|
キャメルケース | スネークケース |
Project | project |
ProjectList | project_list |
match
getのように対象のパスと、実行する処理を指定する方法にmatchがあります。
matchはパス、処理、メソッドの3つを指定する書き方です。
match 'パス', to: 'コントローラ名#アクション名', via: 'メソッド'
matchの実例
例えば、ルートパス「https://example.com」にGETメソッドでアクセスしたときに、Homeコントローラのindexアクションを実行する場合は次のように記述します。
match '/', to: 'home#index', via: 'get'
matchの注意点
matchを使うときはメソッドの指定(via: 'メソッド'
)は必須です。これがないとエラーなります。
ArgumentError
You should not use the match
method in your router without specifying an HTTP method.
If you want to expose your action to both GET and POST, add via: [:get, :post]
option.
If you want to expose your action to GET, use get
in the router:
Instead of: match “controller#action”
Do: get “controller#action”
リダイレクトの設定
getメソッドの to: でリダイレクト先を指定することができます。
デフォルトは301転送(恒久的な転送)です。
get 'パス', to: redirect('リダイレクト先のパス')
一時的な転送(302転送)の場合は、第二引数でstatus: 302
を指定します。
get 'パス', to: redirect('リダイレクト先のパス', status: 302)
リダイレクトの注意点
リダイレクトを設定した場合は、リダイレクト先のパスに対応するルーティングが設定してある必要があります。
設定がないとエラーになります。
Routing Error
No route matches [GET] “/home/index”
リダイレクトの実例
例えば、ルートパス「https://example.com」にアクセスしたときに、一時的にHomeコントローラのindexアクションを実行する場合は次のように記述します。
get '/', to: redirect('/home/index', status: 302)
get 'home/index'
まとめ
指定方法は色々とありますが、コード量は少なくシンプルが基本なので、省略形を使うようにするのがいいです。
優先度は次の順番になります。
root 'コントローラ名#アクション名'
get 'パス'
get 'パス' to: 'コントローラ名#アクション名'
ルーティングの書き方は他にもあるので、詳細は公式ページをご参考ください。
(参考)Rails公式 ルーティング