【Rails】ルーティング getやrootどれを使うべきか?省略形やその他の指定方法とエラーが出る時の注意点

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。
[PR]

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: 'コントローラ名#アクション名'
point

ルーティングにおける 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はパスの部分を省略することができません。パスを指定せず、コントローラとアクションだけを指定するとエラーが発生します。

NGget 'home#index'
OKget 'home/index' (※対象のコントローラとアクションがある場合のみ)


コントローラ指定時の注意点

コントローラを指定するときに、コントローラの名前がキャメルケースで複数の単語が繋がっている場合があります(例:ProjectList)。

このとき、ルーティングで指定するコントローラ名はスネークケースで記述します。(例: project_list)

root 'project_list#index'
get 'project/list' to: 'project_list#index'

例:ルーティングにおけるコントローラ名の命名規則

コントローラ名ルーティングでの指定
キャメルケーススネークケース
Projectproject
ProjectListproject_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: 'メソッド')は必須です。これがないとエラーなります。

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公式 ルーティング

タイトルとURLをコピーしました