Ruby on Railsのルーティングは、ブラウザから送られたHTTPリクエストのURLを解析し、適切なコントローラーのアクションに振り分ける仕組みです。config/routes.rbファイルに定義を記述することで、URLとコントローラーのマッピングを設定します。この記事では、基本的なルーティングの書き方からRESTfulなリソースルーティングまで解説します。
基本的な使い方
config/routes.rbを編集して、URLとコントローラーのアクションを紐づけます。最もシンプルなルーティングの設定方法は以下のとおりです。
Rails.application.routes.draw do
get "/" => "home#index"
endこの設定により、ルートURL(http://127.0.0.1:3000)にGETリクエストが来たとき、HomeControllerのindexアクションが実行されます。
コントローラー名は末尾の「Controller」を省略し、すべて小文字で記述します。例えばHomeControllerは「home」、PostsControllerは「posts」と書きます。
カスタムパスへのルーティング
getの直後の文字列がアクセスされるURLパスです。任意のパスに対してルーティングを設定できます。
Rails.application.routes.draw do
get "/" => "home#index"
get "/about" => "home#about"
get "/contact" => "home#contact"
end上記の設定では、/aboutにアクセスするとHomeControllerのaboutアクション、/contactにアクセスするとcontactアクションが呼ばれます。
rootの記述方法
ルートURL(トップページ)のルーティングには、rootという専用の記法も使えます。
Rails.application.routes.draw do
root "home#index"
endroot "home#index"はget "/" => "home#index"と同じ意味です。Railsコミュニティではこちらの書き方が推奨されています。
パラメータを含むルーティング
URLにパラメータを含めて、動的なルーティングを設定できます。コロン(:)で始まる部分がパラメータとして扱われます。
Rails.application.routes.draw do
get "/posts/:id" => "posts#show"
end/posts/1にアクセスすると、PostsControllerのshowアクションが実行され、params[:id]で「1」を取得できます。
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
end
endリソースベースのルーティング
Railsではresourcesを使って、RESTfulなルーティングを一括で設定できます。これがRailsで最も推奨されるルーティングの定義方法です。
Rails.application.routes.draw do
resources :posts
endこの1行だけで、以下の7つのルーティングが自動的に設定されます。
| HTTPメソッド | パス | アクション | 目的 |
|---|---|---|---|
| GET | /posts | posts#index | 一覧表示 |
| GET | /posts/new | posts#new | 新規作成フォーム |
| POST | /posts | posts#create | 新規作成 |
| GET | /posts/:id | posts#show | 詳細表示 |
| GET | /posts/:id/edit | posts#edit | 編集フォーム |
| PATCH/PUT | /posts/:id | posts#update | 更新 |
| DELETE | /posts/:id | posts#destroy | 削除 |
必要なアクションだけに制限したい場合は、onlyやexceptオプションを使います。
resources :posts, only: [:index, :show]
resources :comments, except: [:destroy]ルーティングの確認方法
設定したルーティングの一覧は、ターミナルで以下のコマンドを実行して確認できます。
rails routes特定のコントローラーに関連するルーティングだけを表示するには、-cオプションを使います。
rails routes -c postsルーティングは上から順に評価されます。同じパスに一致する定義が複数ある場合、先に書かれたものが優先されるため、定義の順序には注意してください。
まとめ
config/routes.rbでURLとコントローラーのアクションを紐づけるrootでトップページのルーティングを設定する:idのようにコロンで始まるパラメータをURLに含められるresourcesで7つのRESTfulルーティングを一括定義できるonlyやexceptで必要なアクションだけに制限可能rails routesコマンドで設定されたルーティングを確認できる