こんにちは、かつコーチです。
「コントローラは書いたのに、画面が表示されない」。
Rails初心者が最初につまずくポイントの一つが、このルーティングの設定です。
この記事では、config/routes.rbの基本的な書き方と、rails routesコマンドでの確認方法を解説します。
読み終える頃には、URLとコントローラのつながりを自分で設計できるようになります。
ルーティングとは?
URLとコントローラをつなぐ地図
ルーティングとは、ブラウザからのリクエスト(URL)を、どのコントローラのどのアクションに渡すかを決める仕組みです。
Railsではconfig/routes.rbというファイルに、その対応関係をまとめて定義します。
たとえば「/postsにアクセスされたら、PostsControllerのindexアクションを実行する」といったルールを、このファイルに書いていきます。
前回の記事で紹介したMVCの中で、ユーザーからのリクエストが最初にたどり着くのがこのルーティングです。
なぜルーティングが必要なのか
コントローラやアクションを作っただけでは、Railsはどのファイルをどのタイミングで呼び出せばいいか分かりません。
ルーティングという「地図」を用意することで、初めてURLとコントローラが結びつきます。
getやpostでのルート定義
基本の書き方
config/routes.rbには、HTTPメソッドとURL、対応するコントローラ・アクションを組み合わせて記述します。
# config/routes.rb
Rails.application.routes.draw do
get "posts", to: "posts#index"
end
この1行は「GET /postsというリクエストが来たら、PostsControllerのindexアクションを実行する」という意味です。to: "posts#index"の部分が、コントローラ名とアクション名を#でつないだ書き方です。
HTTPメソッドの種類と役割
Webアプリでは、目的に応じて複数のHTTPメソッドを使い分けます。
| メソッド | 主な用途 |
|---|---|
get | ページの表示・データの取得 |
post | 新しいデータの作成 |
patch / put | 既存データの更新 |
delete | データの削除 |
たとえば、投稿を新規作成する処理は次のように書きます。
Rails.application.routes.draw do
get "posts", to: "posts#index"
get "posts/new", to: "posts#new"
post "posts", to: "posts#create"
end
get "posts/new"は新規投稿画面を表示するためのルートです。post "posts"は、その画面から送信されたフォームを受け取り、実際にデータを作成するためのルートです。
resourcesで一括定義する
投稿の一覧・詳細・作成・編集・削除といった一連の操作は、1つずつgetやpostを書くと行数が多くなります。
Railsにはresourcesという書き方があり、これを使うと必要なルートをまとめて自動生成できます。
Rails.application.routes.draw do
resources :posts
end
この1行だけで、一覧・詳細・新規作成・編集・更新・削除に対応する7つのルートが自動的に定義されます。resourcesを使ったRESTfulな設計の考え方については、別の記事「RESTfulなルーティング設計(resources)の考え方」で詳しく解説します。
rails routesコマンドでの確認方法
コマンドの実行方法
ルーティングを定義したら、実際にどんなルートが登録されているかを確認しましょう。
ターミナルで次のコマンドを実行します。
bin/rails routes
実行すると、次のような一覧が表示されます。
Prefix Verb URI Pattern Controller#Action
posts GET /posts posts#index
POST /posts posts#create
new_post GET /posts/new posts#new
Prefixはルートの名前、VerbはHTTPメソッド、URI PatternはURLの形、Controller#Actionは呼び出されるコントローラとアクションを表しています。
特定のコントローラだけ絞り込む
ルートの数が多くなってきたら、-cオプションでコントローラを絞り込んで確認できます。
bin/rails routes -c posts
PostsControllerに関連するルートだけが表示されるため、確認したい対象が多いプロジェクトでも見やすくなります。
よくあるつまずきポイント・エラー対処
Before/After:ルート未定義でエラーになるケース
コントローラとビューは用意したのに、ルーティングを書き忘れてアクセスできない、というのはRails初心者が非常によく経験する失敗です。
私自身も投稿詳細ページを作った際、showアクションのルートを書き忘れたまま画面を確認しようとして、次のエラーに遭遇しました。
❌Before:resourcesを書かず、必要なルートが不足している
# config/routes.rb
Rails.application.routes.draw do
get "posts", to: "posts#index"
# showアクションへのルートを書き忘れている
end
この状態で/posts/1にアクセスすると、次のようなエラー画面が表示されます。
ActionController::RoutingError
No route matches [GET] "/posts/1"
このエラーは「そのURLに対応するルートが見つからない」という意味です。
コントローラにアクションを書いていても、ルーティングに定義がなければRailsはリクエストを処理できません。
✅After:resourcesで必要なルートをまとめて定義する
# config/routes.rb
Rails.application.routes.draw do
resources :posts
end
resources :postsと書けば、showを含む基本的なルートがすべて自動的に定義されます。
エラーが出たときは、まずbin/rails routesを実行して、目的のURLがそもそも一覧に存在するかを確認する癖をつけましょう。
まとめ
この記事のポイント
- ルーティングは、URLとコントローラのアクションをつなぐ「地図」の役割を持つ
get・post・patch・deleteなどのHTTPメソッドごとにルートを定義するresources :postsと書くだけで、基本的な7つのルートをまとめて生成できるbin/rails routesでルートの一覧を確認し、RoutingErrorが出たらまずここをチェックする
次に読むべき記事
ルーティングの基本が分かったら、次はリクエストを受け取るコントローラの中身を学びましょう。
「コントローラの基本:アクションとストロングパラメータ」で、アクションの書き方を確認してみてください。
タグ: Ruby on Rails, 初心者向け, フレームワーク基礎