言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Rails辞典

  1. トップページ
  2. Rails辞典
  3. root(ルートURL定義)

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: :topas: オプションで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のルーティングが機能しないことがあります。新規プロジェクトではこのファイルは存在しませんが、古いプロジェクトを引き継いだ際は削除されているか確認する必要があります。

複数のルートをまとめて定義する場合は、resourcesget などのメソッドと組み合わせて使います。ルーティング全体の定義方法については ルーティング をご覧ください。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

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。