Railsルーティング超入門:routes.rbの基本と読み方【保存版】
生徒
「WebアプリってどうやってURLと処理を結びつけてるんですか?」
先生
「それはルーティングという仕組みを使っています。Railsではroutes.rbというファイルにルールを書くことで、URLとコントローラをつなげることができますよ。」
生徒
「ルールって難しそうですね…。初心者でもわかりますか?」
先生
「もちろん!ルーティングの基本から丁寧に解説していきましょう!」
1. ルーティングとは?Railsのroutes.rbって何?
ルーティングとは、URL(ページのアドレス)から「どの処理を実行するのか」を決めるための仕組みです。言い換えると、Webアプリの中でユーザーがどのページを開いたときに、どのコントローラが動くのかを案内する“交通整理”のような役割を持っています。
Railsでは、このルールを config/routes.rb に書きます。ここに記述された内容がアプリ全体の「道しるべ」となり、ブラウザから送られたリクエストを正しい処理へ導きます。たとえば、/users というURLにアクセスされたときに UsersController の index アクションを動かすといった設定ができます。
ごく簡単な例として、次のようなルートを書くと、ブラウザからのアクセスに応じてコントローラが呼び出されます。
# 「/hello」にアクセスすると greetings_controller の hello アクションを呼び出す例
get 'hello', to: 'greetings#hello'
このように、ルーティングは「URL → 実行する処理」の対応表であり、Railsアプリを動かすための最初の入り口となるとても重要な設定です。初心者でも少しずつ書き方を覚えていけば、アプリの構造が理解しやすくなり、開発もぐっと進めやすくなります。
2. 超基本!ルーティングの書き方
Railsでルーティングを書くときは、config/routes.rb に「どのURLでどの処理を呼び出すか」を1行ずつ書いていきます。まずは、最も基本的な書き方から見てみましょう。
get 'users', to: 'users#index'
この1行には、実は3つの要素が含まれています。
get… 「どんな種類のアクセスか」を表すキーワード(ここではページを表示するときのアクセス)'users'… ブラウザでアクセスするURLのパス(例:/users)to: 'users#index'… 「UsersControllerのindexアクションを呼び出す」という意味
つまり、「/users というURLにアクセスが来たら、UsersController の index アクションを動かしてください」という日本語の文章を、1行のコードにしたものが上記のルートです。初めて見ると少し難しく感じますが、慣れてくると「URL → 処理」の対応関係がとても分かりやすく見えてきます。
もう少しイメージをつかむために、「自己紹介ページ(/about)を表示するだけ」のルートも見てみましょう。
get 'about', to: 'pages#about'
この場合は、「/about にアクセスされたら、PagesController の about アクションを表示する」という意味になります。このように、1URLにつき1行ずつ対応を書くのが、ルーティングの超基本の形です。まずはこの書き方に慣れておくと、後から出てくる少し複雑なルールも理解しやすくなります。
3. resourcesでルートを自動生成しよう
ユーザー一覧や詳細表示、登録や更新など、「よくある一連の操作」を毎回1行ずつ書くのは大変です。そこで登場するのがresourcesという書き方です。Railsのルーティングでは、この1語でまとめて複数のルートを自動生成できます。
resources :users
たったこれだけで、次のような7つのルーティングが自動的に用意されます。
GET /users → users#index (ユーザー一覧ページ)
GET /users/:id → users#show (ユーザー詳細ページ)
POST /users → users#create (新規ユーザー作成)
PATCH /users/:id → users#update (ユーザー情報の更新)
PUT /users/:id → users#update (更新の別名)
DELETE /users/:id → users#destroy (ユーザー削除)
GET /users/new → users#new (新規登録フォーム)
GET /users/:id/edit → users#edit (編集フォーム)
つまり、「ユーザー情報の一覧表示・詳細表示・新規作成・編集・削除」といった基本的な操作用ルートを、1行でまとめて定義できるのがresources :usersのメリットです。もしこれを1つずつ手書きすると、次のように行数が増えてしまいます。
# resourcesを使わずに書いた場合のイメージ
get 'users', to: 'users#index'
get 'users/:id', to: 'users#show'
post 'users', to: 'users#create'
patch 'users/:id', to: 'users#update'
delete 'users/:id', to: 'users#destroy'
get 'users/new', to: 'users#new'
get 'users/:id/edit', to: 'users#edit'
どちらも意味は同じですが、resourcesを使うとroutes.rbがスッキリ読みやすくなり、「このモデルは標準的なCRUD操作ができます」という意思表示にもなります。初心者のうちは、resources :usersを見たら「ユーザーに関する基本ルート一式が揃っているんだな」とイメージできれば十分です。まずはresourcesに慣れておくことで、Railsルーティングの全体像がつかみやすくなります。
4. namespaceでURLをグループ化しよう
namespace(ネームスペース)は、「管理画面用のURL」と「一般ユーザー向けのURL」をきれいに分けたいときに使う仕組みです。URLの頭に決まった言葉(プレフィックス)をつけてグループ化できるので、大きくなったRailsアプリのルーティングを整理するのにとても役立ちます。
たとえば、管理者だけが使うユーザー管理画面を作りたい場合は、次のように書きます。
namespace :admin do
resources :users
end
この1ブロックを書くと、URLは次のように「/admin付き」に変わります。
/admin/users → Admin::UsersController#index
/admin/users/:id → Admin::UsersController#show
/admin/users/new → Admin::UsersController#new
/admin/users/:id/edit → Admin::UsersController#edit
…(他のアクションも同様に admin 配下へ)
ポイントは、Admin::UsersController という「Admin という名前のグループに属したコントローラ」が自動的に前提になることです。ディレクトリ構成としては app/controllers/admin/users_controller.rb のように階層を分けておくと、管理画面用の処理が1か所にまとまり、後から見返したときも「ここが管理者用のルートなんだな」とすぐに分かります。
一般ユーザー向けの画面は /users、管理者向けの画面は /admin/users とURLの見た目もはっきり分かれるので、ブラウザでの動作確認もしやすくなります。最初は「admin という専用エリアを作るスイッチ」と捉えておくとイメージしやすく、Railsルーティングの整理にも大きく役立ちます。
5. constraintsで条件付きルーティング
constraints(コンストレイント)を使うと、アクセスする人やURLの形式によって、ルートを分けて設定できます。
たとえば、「スマートフォンからのアクセスは別の処理にしたい」というときに使えます。
constraints(lambda { |req| req.user_agent =~ /iPhone/ }) do
get 'home', to: 'mobile#home'
end
この例では、ユーザーのブラウザ情報(user_agent)に「iPhone」が含まれていたら、モバイル用のmobile#homeにルーティングされます。
6. rootでトップページを設定しよう
rootは、Webアプリの「入り口」つまりトップページの設定です。
root 'home#index'
この設定をすると、「http://あなたのサイト/」にアクセスしたときにHomeControllerのindexアクションが呼ばれます。
7. ルーティング確認コマンド
ルーティングの内容はコマンドで確認できます。以下のコマンドをターミナルで実行してみましょう。
bin/rails routes
すると、現在設定されているルーティングの一覧が表示されます。URL・HTTPメソッド・コントローラがひと目で分かります。
8. ルーティングの順番に注意
routes.rbでは、上から順番にマッチするルートを探していくので、似たようなルートがあるときは、より具体的なルートを先に書くのがコツです。
get 'posts/new', to: 'posts#new'
get 'posts/:id', to: 'posts#show'
こうしないと、先にposts/:idが読まれてしまい、「new」が「id」として解釈される危険があります。