rails routes の見方|出力の読み方・フィルタオプション・URLヘルパーを徹底解説
Rails 開発で「どのURLがどのコントローラに繋がっているか」を確認するための必須コマンド:
bin/rails routes
新しい開発者が参画した時、既存ルートの全体像を把握したい時、No route matches エラーの原因を調査したい時、必ず使うコマンドです。
しかし、bin/rails routes の出力は大規模アプリでは数百行にもなり:
- どの列が何を意味するのか分からない
- 必要なルートだけ絞り込めない
- mounted エンジン(Devise, Sidekiq)のルートが大量混入
--expandedや-gなどの便利オプションを知らない- URL helper の正しい使い方が分からない
- 「ルートはあるはずなのに動かない」が解決できない
など、効率的な使い方を知らないと損する場面が多くあります。
本記事では、rails routes の見方を、出力の読み方から実践的な活用法まで完全網羅します。Prefix/Verb/URI Pattern/Controller#Action の理解、-g/-c/-E/-u の各オプション、URL helper活用、namespace/scope確認、mounted Engine の扱い、ブラウザ表示、ルーティング設計のチェック、トラブルシューティング、FAQまで完全網羅。この1本でRails のルーティングを自信を持って管理できるようになります。
- 1. 結論:今すぐ使える基本パターン10選
- 2. まず押さえる:基本コマンドと出力
- 3. URL helper の使い方
- 4. resources の理解
- 5. namespace / scope の見方
- 6. フィルタオプション
- 7. mounted Engine の確認
- 8. ブラウザで確認(開発環境)
- 9. 出力例:実際のケース
- 10. constraints と format の見方
- 11. routes.rb を分割
- 12. URL helper の応用
- 13. ありがちなトラブル
- 14. ベストプラクティス
- 15. よくある質問(FAQ)
- 15.1. Q1. rake routes と rails routes どちらを使う?
- 15.2. Q2. ルート数が膨大で確認しにくい
- 15.3. Q3. constraints を含めて表示したい
- 15.4. Q4. resources のアクションを部分制限
- 15.5. Q5. ルート名(prefix)をカスタマイズ
- 15.6. Q6. config/routes.rb のリロード
- 15.7. Q7. ルート定義の順序は重要?
- 15.8. Q8. ルートからコントローラ#アクションを特定
- 15.9. Q9. テストでルートを確認
- 15.10. Q10. URL helper を一括 dump
- 15.11. Q11. ルートをJSON形式で出力
- 15.12. Q12. リアルタイムでrouteを変更
- 16. 参考リンク・関連資料
- 17. まとめ
結論:今すぐ使える基本パターン10選
時間がない方向けに、頻出パターンを先に示します。
# ① 全ルート表示
bin/rails routes
# ② キーワード検索(grep)
bin/rails routes -g users
# ③ 特定コントローラ
bin/rails routes -c users
bin/rails routes -c Admin::UsersController
# ④ HTTPメソッド絞り込み
bin/rails routes -g POST
# ⑤ 詳細表示(垂直)
bin/rails routes -E
bin/rails routes --expanded
# ⑥ 未使用ルート検出
bin/rails routes -u
# ⑦ URLパスで検索
bin/rails routes -g /users/1
# ⑧ ヘルプ表示
bin/rails routes --help
# ⑨ ブラウザで確認(開発環境)
# http://localhost:3000/rails/info/routes
# ⑩ console で確認(前出 rails console 使い方記事の app オブジェクト)
app.users_path # => "/users"
詳細は以下で順に解説します。
まず押さえる:基本コマンドと出力
基本実行
bin/rails routes
出力例:
Prefix Verb URI Pattern Controller#Action
root GET / home#index
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
api_v1_users GET /api/v1/users(.:format) api/v1/users#index
POST /api/v1/users(.:format) api/v1/users#create
4つの列の意味
| 列 | 意味 | 例 |
|---|---|---|
| Prefix | URL helper の prefix({prefix}_path等) | user, new_user |
| Verb | HTTPメソッド | GET, POST, PATCH, PUT, DELETE |
| URI Pattern | URL パターン | /users/:id(.:format) |
| Controller#Action | 処理するコントローラ#アクション | users#show |
URI Pattern の記号
/users/:id(.:format)
↑ ↑
動的パラメータ オプショナル
:id: URL パラメータ(コントローラでparams[:id]で取得)(.:format): 拡張子(任意)。.json,.xml等
例:
/users/1→params[:id] = "1"/users/1.json→params[:id] = "1",params[:format] = "json"
URL helper の使い方
Prefix から helper メソッドを導出
Prefix: user
URI: /users/:id
→ URL helper:
user_path(@user) # => "/users/1"
user_url(@user) # => "http://example.com/users/1"
| Prefix の suffix | 戻り値 |
|---|---|
_path | 相対パス(ホスト・スキーマなし) |
_url | 完全URL(http://example.com 含む) |
View で使う
<%= link_to "Edit", edit_user_path(@user) %>
<%= form_with model: @user, url: user_path(@user) %>
controller で使う
class UsersController < ApplicationController
def create
@user = User.create(user_params)
redirect_to user_path(@user)
# または
redirect_to @user # 自動でuser_pathが呼ばれる
end
end
console で確認
# bin/rails c
app.user_path(1) # => "/users/1"
app.users_path # => "/users"
app.edit_user_path(1) # => "/users/1/edit"
詳細はrails console 使い方の記事も参照。
パラメータ付き
user_path(@user, format: :json)
# => "/users/1.json"
user_path(@user, sort: "name", page: 2)
# => "/users/1?sort=name&page=2"
# 名前付きパラメータ
search_path(q: "Rails")
# => "/search?q=Rails"
resources の理解
# config/routes.rb
resources :users
これで7つのルートが一度に定義されます:
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
CRUD と HTTPメソッドの対応
| アクション | HTTPメソッド | URLパス | helper |
|---|---|---|---|
| index | GET | /users | users_path |
| show | GET | /users/:id | user_path(@user) |
| new | GET | /users/new | new_user_path |
| create | POST | /users | users_path |
| edit | GET | /users/:id/edit | edit_user_path(@user) |
| update | PATCH/PUT | /users/:id | user_path(@user) |
| destroy | DELETE | /users/:id | user_path(@user) |
only / except で制限
# index と show のみ
resources :users, only: [:index, :show]
# destroy 以外
resources :users, except: [:destroy]
resource(単数)
resource :profile
→ 6つのルート(index がない):
Prefix Verb URI Pattern Controller#Action
profile GET /profile/new(.:format) profiles#new
POST /profile(.:format) profiles#create
edit_profile GET /profile/edit(.:format) profiles#edit
profile GET /profile(.:format) profiles#show
PATCH /profile(.:format) profiles#update
PUT /profile(.:format) profiles#update
DELETE /profile(.:format) profiles#destroy
ログインユーザーの「自分のプロフィール」のように、IDなしで1つのリソースを扱う時に使う。
ネストしたresources
resources :users do
resources :posts
end
→
user_posts GET /users/:user_id/posts(.:format) posts#index
POST /users/:user_id/posts(.:format) posts#create
new_user_post GET /users/:user_id/posts/new(.:format) posts#new
edit_user_post GET /users/:user_id/posts/:id/edit(.:format) posts#edit
user_post GET /users/:user_id/posts/:id(.:format) posts#show
PATCH /users/:user_id/posts/:id(.:format) posts#update
PUT /users/:user_id/posts/:id(.:format) posts#update
DELETE /users/:user_id/posts/:id(.:format) posts#destroy
helper の使い方:
user_posts_path(@user) # => "/users/1/posts"
user_post_path(@user, @post) # => "/users/1/posts/2"
member / collection
resources :users do
member do
get :profile # /users/:id/profile(特定のuser)
post :follow
end
collection do
get :search # /users/search(全users対象)
get :recent
end
end
profile_user GET /users/:id/profile(.:format) users#profile
follow_user POST /users/:id/follow(.:format) users#follow
search_users GET /users/search(.:format) users#search
recent_users GET /users/recent(.:format) users#recent
namespace / scope の見方
namespace
namespace :admin do
resources :users
end
→
admin_users GET /admin/users(.:format) admin/users#index
POST /admin/users(.:format) admin/users#create
new_admin_user GET /admin/users/new(.:format) admin/users#new
edit_admin_user GET /admin/users/:id/edit(.:format) admin/users#edit
admin_user GET /admin/users/:id(.:format) admin/users#show
...
- パス:
/admin/users - コントローラ:
Admin::UsersController(app/controllers/admin/users_controller.rb) - helper:
admin_users_path
scope(モジュール分離なし、URLだけ変更)
scope "/admin" do
resources :users
end
→
users GET /admin/users(.:format) users#index
POST /admin/users(.:format) users#create
...
- パス:
/admin/users - コントローラ:
UsersController(通常) - helper:
users_path
scope module(URLは普通、コントローラだけ別名前空間)
scope module: :admin do
resources :users
end
→ パスは /users だが、コントローラは Admin::UsersController。
API バージョン管理
namespace :api do
namespace :v1 do
resources :users
end
namespace :v2 do
resources :users
end
end
→
api_v1_users GET /api/v1/users(.:format) api/v1/users#index
api_v2_users GET /api/v2/users(.:format) api/v2/users#index
フィルタオプション
ルート数が多い大規模アプリで必須。
-g(grep)
最頻出のフィルタ。Prefix、URI、Controller#Action のすべてに対して部分一致:
# helper名で検索
bin/rails routes -g new_comment
# HTTPメソッドで検索
bin/rails routes -g POST
# URLパスで検索
bin/rails routes -g admin
# 特定パスでの解決確認(Rails 7.0+)
bin/rails routes -g /users/1
# 該当する全ルート(GET/PATCH/PUT/DELETE)を表示
-c(controller)
特定コントローラのルートのみ:
bin/rails routes -c users
bin/rails routes -c admin/users
bin/rails routes -c Admin::UsersController
-E(expanded、詳細表示)
垂直方向で1ルートずつ詳細表示:
bin/rails routes -E
# または
bin/rails routes --expanded
出力例:
--[ Route 1 ]----------------------------------------------------
Prefix | users
Verb | GET
URI | /users(.:format)
Controller#Action | users#index
--[ Route 2 ]----------------------------------------------------
Prefix |
Verb | POST
URI | /users(.:format)
Controller#Action | users#create
--[ Route 3 ]----------------------------------------------------
Prefix | new_user
Verb | GET
URI | /users/new(.:format)
Controller#Action | users#new
長いプレフィックスやコントローラ名で横にはみ出して読みにくい場合に便利。
-u(unused、未使用ルート)
定義されているがどこからも参照されていないルート:
bin/rails routes -u
開発中に作って使わなくなったルートを発見できます。
組み合わせ
# Admin の POST だけ
bin/rails routes -c admin -g POST
# expanded + 検索
bin/rails routes -g api -E
mounted Engine の確認
Devise、Sidekiq、Mission Control など、外部 Engine が mount されているルート。
config/routes.rb
# Devise(認証)
devise_for :users
# Sidekiq Web UI
mount Sidekiq::Web => "/sidekiq"
# Mission Control(Solid Queue)
mount MissionControl::Jobs::Engine, at: "/jobs"
rails routes での表示
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
sidekiq /sidekiq Sidekiq::Web
jobs /jobs MissionControl::Jobs::Engine
Engine 内の詳細ルートは表示されないことが多い。
Engine 内のルートを確認
# Sidekiq engine の内部routes
bin/rails routes -g sidekiq -E
# devise 関連のみ
bin/rails routes -c devise
ブラウザで確認(開発環境)
ターミナルでなくブラウザで見やすく:
http://localhost:3000/rails/info/routes
メリット
- 検索ボックスで絞り込み(部分一致)
- 表形式で見やすい
- リンクで該当コントローラへジャンプ可能(一部)
デメリット
- 開発環境のみ
- 巨大なルート定義だと表示が重い
404 ページから
開発環境で RoutingError が出た時、エラー画面下部に全ルート一覧が表示されます。No route matches 時のヒントとして有用。
詳細はActionController::RoutingError の記事参照。
出力例:実際のケース
ケース1:典型的なRails 8 アプリ
bin/rails routes
Prefix Verb URI Pattern Controller#Action
root GET / home#index
# 認証(Rails 8 authentication generator)
session DELETE /session(.:format) sessions#destroy
new_session GET /session/new(.:format) sessions#new
POST /session(.:format) sessions#create
passwords POST /passwords(.:format) passwords#create
new_password GET /passwords/new(.:format) passwords#new
edit_password GET /passwords/:token/edit(.:format) passwords#edit
password PATCH /passwords/:token(.:format) passwords#update
PUT /passwords/:token(.:format) passwords#update
# 通常リソース
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
# Solid Queue management(Mission Control)
jobs /jobs MissionControl::Jobs::Engine
ケース2:API モード
bin/rails routes
Prefix Verb URI Pattern Controller#Action
api_v1_users GET /api/v1/users(.:format) api/v1/users#index
POST /api/v1/users(.:format) api/v1/users#create
api_v1_user GET /api/v1/users/:id(.:format) api/v1/users#show
PATCH /api/v1/users/:id(.:format) api/v1/users#update
PUT /api/v1/users/:id(.:format) api/v1/users#update
DELETE /api/v1/users/:id(.:format) api/v1/users#destroy
API 専用なので、new / edit アクションのルートが無いことが特徴。
constraints と format の見方
format 制約
get "/api/users", to: "api/users#index", defaults: { format: :json }
get "/users/:id", to: "users#show", format: :html
constraints による制約
constraints subdomain: "api" do
resources :users
end
constraints id: /\d+/ do
resources :posts
end
これらは rails routes で詳細は表示されないため、 config/routes.rb を直接確認が必要。
-E でconstraints も表示
bin/rails routes -E
一部のconstraints は expanded 表示で確認できることもあります。
routes.rb を分割
巨大なroutes.rb を分割(Rails 6+):
# config/routes.rb
Rails.application.routes.draw do
draw(:api) # config/routes/api.rb
draw(:admin) # config/routes/admin.rb
root "home#index"
end
# config/routes/api.rb
namespace :api do
namespace :v1 do
resources :users
end
end
# config/routes/admin.rb
namespace :admin do
resources :users
resources :posts
end
bin/rails routes では分割関係なくすべて表示。
URL helper の応用
キーワード引数
# /users/:id/posts/:post_id
nested_post_path(user_id: 1, post_id: 2)
# => "/users/1/posts/2"
# オブジェクトを渡す
user_post_path(@user, @post)
# => "/users/1/posts/2"
配列での渡し方
url_for([@user, @post])
# => "/users/1/posts/2"
polymorphic_path([@user, @post])
# 同上
form_with との連携
<%= form_with model: [@user, @post] do |f| %>
<%# 自動的に user_post_path に POST/PATCH 送信 %>
<% end %>
redirect_to との連携
# モデルオブジェクト → show のURLにredirect
redirect_to @user
# → user_path(@user) と同等
# 配列 → ネストしたルート
redirect_to [@user, @post]
ありがちなトラブル
トラブル1:No route matches
詳細はActionController::RoutingError の記事。確認手順:
# 該当URLをgrep
bin/rails routes -g /users/123
# HTTPメソッドも確認
bin/rails routes -g POST
トラブル2:missing required keys
No route matches {:action=>"show", :controller=>"users"}, missing required keys: [:id]
user_path に id が渡されていない。
<%# ❌ %>
<%= link_to "Edit", user_path %>
<%# ✅ %>
<%= link_to "Edit", user_path(@user) %>
トラブル3:helper が存在しない(NoMethodError)
useres_path
# NoMethodError: undefined method 'useres_path'
ルート名の typo。bin/rails routes -g users で正しい helper 名確認。
詳細はundefined method nil:NilClass の記事参照。
トラブル4:HTTPメソッド違い
No route matches [POST] "/users/1"
POSTで送るのは /users/1 ではなく /users。
bin/rails routes -g users
# POST /users users#create ← 確認
# PATCH /users/:id users#update
更新なら PATCH を使う:
<%= form_with model: @user, method: :patch do %>
トラブル5:CSRF token不足でPOSTがGET扱い
No route matches [GET] "/users/1"
GET でアクセスしようとしているが対応するルートが無い(destroy ルートはDELETE)。
<%# ❌ %>
<%= link_to "削除", user_path(@user) %>
<%# ✅ Turbo 経由 %>
<%= link_to "削除", user_path(@user), data: { turbo_method: :delete } %>
<%# または button_to %>
<%= button_to "削除", user_path(@user), method: :delete %>
トラブル6:namespace と scope の混同
# namespace = URL + controller両方変更
namespace :admin do
resources :users # /admin/users → Admin::UsersController
end
# scope = URL のみ変更
scope "/admin" do
resources :users # /admin/users → UsersController
end
意図と違う動作の場合、rails routes -c admin で確認。
トラブル7:mounted Engine が動かない
mount Sidekiq::Web => "/sidekiq"
# /sidekiq にアクセスして 404
- gem インストール忘れ
- 認証ミドルウェア通過漏れ
- routes.rb の順序
bin/rails routes -g sidekiq
# routes 自体が登録されているか確認
ベストプラクティス
1. リソースフルなルーティング
CRUDが綺麗にハマるなら resources を活用:
# ✅ 推奨
resources :users
# ❌ 同等の冗長な書き方
get '/users', to: 'users#index'
post '/users', to: 'users#create'
get '/users/new', to: 'users#new'
# ...
2. namespace で API バージョン
namespace :api do
namespace :v1 do
resources :users
end
end
3. concerns でルート共通化
concern :commentable do
resources :comments
end
resources :articles, concerns: :commentable
resources :photos, concerns: :commentable
4. constraints で動的制約
constraints id: /\d+/ do
resources :users
end
5. only / except で必要なアクションだけ
# 7アクション全部不要な場合
resources :users, only: [:index, :show]
# 削除だけ別途
resources :users, except: [:destroy]
delete 'users/:id/soft_delete', to: 'users#soft_delete', as: :soft_delete_user
6. 名前空間は早めに整理
# 規模が大きくなる前に
namespace :api do
namespace :v1 do
# ...
end
end
後から構造変更すると URL helper が変わり、全箇所修正が必要。
7. ルート設計のドキュメント化
# config/routes.rb の冒頭に
#
# Public routes:
# GET / => home
# GET /about => static
#
# User routes:
# GET /signup
# POST /signin
#
# API:
# GET /api/v1/users
#
よくある質問(FAQ)
Q1. rake routes と rails routes どちらを使う?
Rails 6.1+ では bin/rails routes が標準。rake routes は非推奨。
Q2. ルート数が膨大で確認しにくい
# grep で絞り込み
bin/rails routes -g users
# またはブラウザで
http://localhost:3000/rails/info/routes
Q3. constraints を含めて表示したい
-E で表示が試みられますが、すべての制約は出ません。config/routes.rb を直接確認するのが確実。
Q4. resources のアクションを部分制限
resources :users, only: [:index, :show]
# index, show のみ生成
resources :users, except: [:destroy]
# destroy 以外
Q5. ルート名(prefix)をカスタマイズ
# as: で名前変更
get "/profile", to: "users#show", as: :my_profile
# → my_profile_path
resources :users, as: :members
# → members_path, member_path 等
Q6. config/routes.rb のリロード
通常は開発環境で自動リロード。手動で:
# rails console で
Rails.application.reload_routes!
Q7. ルート定義の順序は重要?
重要。先に書かれたルートが優先:
# ❌ 順序が悪い
get "*path", to: "errors#not_found" # catch-all
resources :users # ← 到達しない
# ✅
resources :users
get "*path", to: "errors#not_found" # 最後に
Q8. ルートからコントローラ#アクションを特定
# URL からの逆引き
bin/rails routes -g /users/1
# または ブラウザで /rails/info/routes 検索
Q9. テストでルートを確認
# RSpec
describe "routing" do
it "routes /users to users#index" do
expect(get: "/users").to route_to("users#index")
end
end
rspec-rails の routing matcher 利用。
Q10. URL helper を一括 dump
# config/routes.rb の名前
Rails.application.routes.named_routes.routes.each do |name, route|
puts "#{name}_path"
end
Q11. ルートをJSON形式で出力
公式オプションでJSON出力はないが、自前で:
require "json"
routes = Rails.application.routes.routes.map do |route|
{
name: route.name,
verb: route.verb,
path: route.path.spec.to_s,
controller: route.defaults[:controller],
action: route.defaults[:action]
}
end
puts JSON.pretty_generate(routes)
Q12. リアルタイムでrouteを変更
開発時には自動で再読み込みされますが、テスト等で動的に変更したい:
Rails.application.routes.draw do
get "/dynamic", to: "tests#dynamic"
end
通常は config/routes.rb で静的に。動的ルートは特殊用途のみ。
参考リンク・関連資料
Rails 公式
- Rails Routing from the Outside In(Guide) – ルーティング公式ガイド
- The Rails Command Line(Guide) – コマンド全般
- Action Controller Overview(Guide) – Controller との連携
関連 Gem
- routes_lazy_routes – 大規模アプリのroutes高速化
- dry-validation – パラメータ検証
関連記事(本サイト)
- rails db:migrate 使い方 – DB操作リファレンス
- rails generate 使い方 – generator リファレンス
- rails console 使い方 – app.routes で確認
- ActionController::RoutingError エラー対処 – ルーティングエラー詳細
- undefined method nil:NilClass – helper の引数nil問題
- ActiveRecord::RecordNotFound – find系のエラー
- Rails 8 アップグレードガイド – 認証generator のroutes
- Solid Queue 使い方 – Mission Control の mount
まとめ
rails routes は Rails 開発の必須コマンド。要点を再整理します。
- 4つの列: Prefix(helper名の元)、Verb(HTTPメソッド)、URI Pattern、Controller#Action
- URL helper: Prefix から
_path/_urlを組み合わせて使う - resources: 7つのRESTfulルートを一括定義(only/except で制限可)
- resource(単数): IDなしの単一リソース用、6つのルート
- namespace vs scope: namespace = URL + controller、scope = URL のみ
- フィルタオプション:
-gでPrefix/URI/Action のキーワード検索-cでコントローラ絞り込み-Eで詳細表示(垂直)-uで未使用検出
- ブラウザ確認:
/rails/info/routes - mounted Engine: Devise/Sidekiq/Mission Control 等
- ありがちトラブル: HTTPメソッド違い、CSRF、helper のid漏れ
- ベストプラクティス: リソースフル、namespace でAPI管理、constraints活用
これらの知識は、Rails アプリの開発・デバッグ・コードレビュー・新規参画時のキャッチアップなど、あらゆる場面で活用できます。本記事をブックマークしておけば、ルーティング関連の作業を効率的に進められるようになります。
本記事は2026年6月時点の情報をもとに、Ruby on Rails 7.x / 8.x での動作確認・公式ドキュメントに基づき作成しています。Rails のバージョンによって挙動が異なる場合があるため、最新の情報はRails公式ガイドもあわせてご確認ください。
-
前の記事
【完全リファレンス】rails console の使い方|デバッグ・調査・実験に使える機能を徹底解説 2026.06.29
-
次の記事
【完全リファレンス】rails generate の使い方|model/controller/scaffold/migration等の全generatorを徹底解説 2026.06.29
コメントを書く