root(ルートURL定義)
| 対応: | Rails 6(2019) |
|---|
『Ruby on Rails』の root メソッドは、アプリケーションのルートURL(/)に対応するルートを config/routes.rb に定義します。サイトにアクセスした際に最初に表示されるページを指定するために使われ、ほとんどのRailsアプリケーションで必須の設定です。
構文
Rails.application.routes.draw do root 'コントローラ名#アクション名' # to: キーワードを使った書き方(上と同じ意味) root to: 'コントローラ名#アクション名' end
主な書き方一覧
| 書き方 | 概要 |
|---|---|
| root 'pages#home' | PagesControllerのhomeアクションをルートURLに割り当てます。 |
| root 'articles#index' | ArticlesControllerのindexアクションをルートURLに割り当てます。 |
| root to: 'welcome#index' | to: キーワードを使ってルートURLのルートを定義します。 |
| root 'home#index', as: :top | as: オプションでURLヘルパーメソッドの名前を変更します(デフォルトは root_path)。 |
サンプルコード
PagesControllerのhomeアクションをルートURLに設定し、トップページを表示する例です。
config/routes.rb
Rails.application.routes.draw do root 'pages#home' end
app/controllers/pages_controller.rb
class PagesController < ApplicationController
# GET /
def home
@recent_articles = Article.order(created_at: :desc).limit(3)
end
end
app/views/pages/home.html.erb
<h1>ようこそ!</h1>
<h2>新着記事</h2>
<ul>
<% @recent_articles.each do |article| %>
<li><%= link_to article.title, article_path(article) %></li>
<% end %>
</ul>
namespace 内での root の定義
namespaceブロック内でもrootを定義できます。この場合は/admin/のようなURLプレフィックスが付いたルートURLに対応するルートが生成されます。
config/routes.rb(namespaceとrootの組み合わせ)
Rails.application.routes.draw do
# メインアプリのルートURL(/)
root 'pages#home'
namespace :admin do
# 管理画面のルートURL(/admin/)
root 'dashboard#index'
end
end
上記の定義で生成されるURLヘルパーは以下の通りです。
root_path→/admin_root_path→/admin/
ルートURLの動作確認
ルートURLが正しく定義されているかは、ターミナルで以下のコマンドを実行して確認できます。
ターミナル
rails routes | grep 'root'
出力例は次のようになります。
root GET / pages#home admin_root GET /admin(.:format) admin/dashboard#index
テストコードでルートURLを確認する場合はroot_pathヘルパーを使います。
test/controllers/pages_controller_test.rb
class PagesControllerTest < ActionDispatch::IntegrationTest
test "GET / returns 200" do
get root_path
assert_response :success
end
end
概要
root で定義したルートは、root_path(相対パス)および root_url(絶対URL)というURLヘルパーメソッドで参照できます。たとえばログイン後にトップページへリダイレクトしたい場合は redirect_to root_path と書けます。as: オプションでヘルパー名を変更した場合は、そのカスタム名に _path / _url を付けたメソッドが使えるようになります。
ルートURL(/)に対してデフォルトで作成される public/index.html が存在する場合、そちらが優先されてRailsのルーティングが機能しないことがあります。新規プロジェクトではこのファイルは存在しませんが、古いプロジェクトを引き継いだ際は削除されているか確認する必要があります。
複数のルートをまとめて定義する場合は、resources や get などのメソッドと組み合わせて使います。ルーティング全体の定義方法については ルーティング をご覧ください。REST(Representational State Transfer)に基づくリソースルートの定義については resources もあわせてご参照ください。
よくあるミス
root の二重定義(同じ routes.rb に root を2回書くと後の定義が有効になる)
config/routes.rb の中で root を2回定義すると、後から書いた方が有効になります。意図せず2箇所に書いてしまった場合、どちらが適用されているか分かりにくいため注意が必要です。rails routes で実際に有効なルートを確認します。
config/routes_ng.rb
Rails.application.routes.draw do root 'pages#home' resources :articles # 後から追加した root が上書きする root 'welcome#index' end
config/routes_ok.rb
Rails.application.routes.draw do root 'pages#home' resources :articles end
public/index.html の残存(Rails は public/ を静的ファイルとして優先するので削除が必要)
Railsアプリケーションは public/ ディレクトリ内のファイルを静的ファイルとして扱い、ルーティングよりも先に配信します。そのため public/index.html が存在すると、root で定義したルーティングが無視されてその静的ファイルが表示されます。古いプロジェクトを引き継いだときは public/index.html が残っていないか確認します。
ls public/index.html
ファイルが存在する場合は削除します。
rm public/index.html
namespace 内での root の書き方を間違える
namespaceブロック内で root を定義する際に、namespace外で書いてしまうと意図した URL に割り当てられません。root は必ず対応する namespace ブロックの内側に書きます。
config/routes_ng.rb
Rails.application.routes.draw do
namespace :admin do
resources :articles
end
# namespace の外に書いてしまった — /admin/ ではなく / に割り当てられる
root 'admin/dashboard#index'
end
config/routes_ok.rb
Rails.application.routes.draw do
namespace :admin do
resources :articles
# namespace の内側に書くと /admin/ に割り当てられる
root 'dashboard#index'
end
root 'pages#home'
end
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。