ルーティング(routes)
ルーティング定義
説明
URLとアプリケーションのパラメータを結びつける仕組み
説明
- 設定ファイルは、「config/routes.rb」
- 優先順位は、上から順
デフォルトの設定
match ':controller(/:action(/:id(.:format)))'
- http:// ホスト名:ポート番号/:controller/:action/:id
- params[:id]でパラメータidの値を取得
ルートを定義
説明
アクセス可能なURLを指定することでHTMLリクエストを処理
使い方
match(URLパターン, オプション=nil)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを必ずセットで指定 |
:to | :controller, :actionの短縮形。#で区切る |
:param | パラメータを指定 |
:path | パスを指定 |
:module | コントローラの名前空間 |
:as | ルート名に使用する別名 |
:via | HTTPメソッドを指定 |
:on | 名前付きルートを指定 |
:constraints | URLのフォーマットを制限 |
:defaults | デフォルト値 |
:anchor | アンカーリンク |
:format | フォーマットを指定 |
例
ルートを定義
match 'pages/show'
# pages_show /pages/show(.:format) pages#show
コントローラとアクションを指定
match "pages", controller: :pages, action: :show
# pages /pages(.:format) pages#show
コントローラとアクションをtoを使った短縮形で指定
match "pages", to: 'pages#show'
# pages /pages(.:format) pages#show
HTTPメソッドを指定
match "pages/show", via: :get
# pages_show GET /pages/show(.:format) pages#show
HTTPメソッドを複数指定
match ':controller/:action/:id', via: [:get, :post]
ルート名に使用する別名を指定
match "pages/show", as: 'main'
# main /pages/show(.:format) pages#show
ソースコード
複数形のリソースのルーティング
説明
リソースベースのルーティング
使い方
resources(リソース名.., ブロック引数)
オプション
オプション | 説明 |
---|---|
:as | ルート名に利用する別名 |
:controller | コントローラを指定 |
:path_names | 指定したアクションのみ名前の変更 |
:path | URLを書き換える |
:only | 生成されるURLを絞り込む |
:except | 指定したURLは生成しない |
:shallow | ルーティングを複雑化しない |
:shallow_path | 指定したパラメータを先頭に追加 |
:shallow_prefix | 指定したパラメータを名前付きルーティングとして先頭に追加 |
:format | フォーマット指定 |
:param | パラメータを上書き |
生成されるルート
URL | アクション | HTTPメソッド | 説明 |
---|---|---|---|
/XXXs | index | GET | 一覧画面を生成 |
/XXXs/:id | show | GET | 詳細画面を生成 |
/XXXs/new | new | GET | 登録画面を生成 |
/XXXs | create | POST | 登録処理 |
/XXXs/:id/edit | edit | GET | 編集画面を生成 |
/XXXs/:id | update | PUT | 更新処理 |
/XXXs/:id | destroy | DELETE | 削除処理 |
生成されるパス
パス | URL | 戻り値 |
---|---|---|
XXXs_path | XXXs_url | /XXXs |
XXX_path(:id) | XXX_url(:id) | /XXXs/:id |
new_XXX_path | new_XXX_url | /XXXs/new |
edit_XXX_path(:id) | edit_XXX_url(:id) | /XXXs/:id/edit |
例
RESTfulなURLを自動生成
resources :pages
# pages GET /pages(.:format) pages#index
# POST /pages(.:format) pages#create
# new_page GET /pages/new(.:format) pages#new
# edit_page GET /pages/:id/edit(.:format) pages#edit
# page GET /pages/:id(.:format) pages#show
# PUT /pages/:id(.:format) pages#update
# DELETE /pages/:id(.:format) pages#destroy
ルート名に使用する名前をmainにする
resources :pages, as: :main
# main_index GET /pages(.:format) pages#index
# POST /pages(.:format) pages#create
# new_main GET /pages/new(.:format) pages#new
# edit_main GET /pages/:id/edit(.:format) pages#edit
# main GET /pages/:id(.:format) pages#show
# PUT /pages/:id(.:format) pages#update
# DELETE /pages/:id(.:format) pages#destroy
処理するコントローラを指定
resources :pages, controller: :mains
# pages GET /pages(.:format) mains#index
# POST /pages(.:format) mains#create
# new_page GET /pages/new(.:format) mains#new
# edit_page GET /pages/:id/edit(.:format) mains#edit
# page GET /pages/:id(.:format) mains#show
# PUT /pages/:id(.:format) mains#update
# DELETE /pages/:id(.:format) mains#destroy
URLを置き換える
resources "pages", path: 'admin/page'
# pages GET /admin/page(.:format) pages#index
# POST /admin/page(.:format) pages#create
# new_page GET /admin/page/new(.:format) pages#new
# edit_page GET /admin/page/:id/edit(.:format) pages#edit
# page GET /admin/page/:id(.:format) pages#show
# PUT /admin/page/:id(.:format) pages#update
# DELETE /admin/page/:id(.:format) pages#destroy
作成されるURLを絞り込む
resources :pages, only: [:index]
# pages GET /pages(.:format) pages#index
作成しないURLを指定
resources :pages, except: [:index, :show]
# pages POST /pages(.:format) pages#create
# new_page GET /pages/new(.:format) pages#new
# edit_page GET /pages/:id/edit(.:format) pages#edit
# page PUT /pages/:id(.:format) pages#update
# DELETE /pages/:id(.:format) pages#destroy
コントローラにnamespaceを不要
resources :pages, module: :main
# pages GET /pages(.:format) main/pages#index
# POST /pages(.:format) main/pages#create
# new_page GET /pages/new(.:format) main/pages#new
# edit_page GET /pages/:id/edit(.:format) main/pages#edit
# page GET /pages/:id(.:format) main/pages#show
# PUT /pages/:id(.:format) main/pages#update
# DELETE /pages/:id(.:format) main/pages#destroy
制限を付ける
resources :users, constraints: {title: /[a-z]{1,15}/}
# users GET /users(.:format) users#index {:title=>/[a-z]{1,15}/}
# POST /users(.:format) users#create {:title=>/[a-z]{1,15}/}
# new_user GET /users/new(.:format) users#new {:title=>/[a-z]{1,15}/}
# edit_user GET /users/:id/edit(.:format) users#edit {:title=>/[a-z]{1,15}/}
# user GET /users/:id(.:format) users#show {:title=>/[a-z]{1,15}/}
# PUT /users/:id(.:format) users#update {:title=>/[a-z]{1,15}/}
# DELETE /users/:id(.:format) users#destroy {:title=>/[a-z]{1,15}/}
ブロック
resources :photos do
resources :comments
end
ソースコード
単一のリソースのルーティング
説明
単数形のリソースのルーティング
使い方
resource(リソース名.., ブロック引数)
オプション
オプション | 説明 |
---|---|
:as | ルート名に利用する別名 |
:controller | コントローラを指定 |
:path_names | 指定したアクションのみ名前の変更 |
:path | URLを書き換える |
:only | 生成されるURLを絞り込む |
:except | 指定したURLは生成しない |
:shallow | ルーティングを複雑化しない |
:shallow_path | 指定したパラメータを先頭に追加 |
:shallow_prefix | 指定したパラメータを名前付きルーティングとして先頭に追加 |
:format | フォーマット指定 |
:param | パラメータを上書き |
生成されるルート
URL | アクション | HTTPメソッド | 説明 |
---|---|---|---|
/XXX | show | GET | 詳細画面を生成 |
/XXX/new | new | GET | 登録画面を生成 |
/XXX | create | POST | 登録処理 |
/XXX/edit | edit | GET | 編集画面を生成 |
/XXX | update | PUT | 更新処理 |
/XXX | destroy | DELETE | 削除処理 |
生成されるパス
パス | URL | 戻り値 |
---|---|---|
XXX_path | XXX_url | /XXX |
new_XXX_path | new_XXX_url | /XXX/new |
edit_XXX_path | edit_XXX_url | /XXX/edit |
例
単一のリソースを定義
resource :page
# page POST /page(.:format) pages#create
# new_page GET /page/new(.:format) pages#new
# edit_page GET /page/edit(.:format) pages#edit
# GET /page(.:format) pages#show
# PUT /page(.:format) pages#update
# DELETE /page(.:format) pages#destroy
ルート名に使用する名前
resource :page, as: :main
# main POST /page(.:format) pages#create
# new_main GET /page/new(.:format) pages#new
# edit_main GET /page/edit(.:format) pages#edit
# GET /page(.:format) pages#show
# PUT /page(.:format) pages#update
# DELETE /page(.:format) pages#destroy
処理するコントローラを指定
resource :page, controller: :main
# page POST /page(.:format) main#create
# new_page GET /page/new(.:format) main#new
# edit_page GET /page/edit(.:format) main#edit
# GET /page(.:format) main#show
# PUT /page(.:format) main#update
# DELETE /page(.:format) main#destroy
URLを置き換える
resource :page, path: 'admin/page'
# page POST /admin/page(.:format) pages#create
# new_page GET /admin/page/new(.:format) pages#new
# edit_page GET /admin/page/edit(.:format) pages#edit
# GET /admin/page(.:format) pages#show
# PUT /admin/page(.:format) pages#update
# DELETE /admin/page(.:format) pages#destroy
作成されるURLを絞り込む
resource :page, only: [:show]
# page GET /page(.:format) pages#show
作成しないURLを指定
resource :page, except: [:create, :new]
# edit_page GET /page/edit(.:format) pages#edit
# page GET /page(.:format) pages#show
# PUT /page(.:format) pages#update
# DELETE /page(.:format) pages#destroy
コントローラにnamespaceを不要
resource :page, module: :admin
# page POST /page(.:format) admin/pages#create
# new_page GET /page/new(.:format) admin/pages#new
# edit_page GET /page/edit(.:format) admin/pages#edit
# GET /page(.:format) admin/pages#show
# PUT /page(.:format) admin/pages#update
# DELETE /page(.:format) admin/pages#destroy
ソースコード
ルートのURLを指定
説明
ルート(/)のURLを指定
使い方
root(パス, オプション={})
パス
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
オプション
オプション | 説明 |
---|---|
:param | パラメータを指定 |
:path | パスを指定 |
:module | コントローラの名前空間 |
:as | ルート名に使用する別名 |
:via | HTTPメソッドを指定 |
:on | 名前付きルートを指定 |
:constraints | URLのフォーマットを制限 |
:defaults | デフォルト値 |
:anchor | アンカーリンク |
:format | フォーマットを指定 |
例
pagesコントローラとindexアクションをrootに指定
root controller: 'pages', action: 'index'
# root / pages#index
コントローラとアクションをtoを使った省略形で記述
root to: 'pages#index'
# root / pages#index
toを省略
root 'pages#index'
# root / pages#index
ソースコード
URLにnamespaceを付与
説明
よく利用する検索条件をあらかじめ準備
使い方
scope(スコープ名, 条件式、ブロック引数)
例
scope :rails_base, where(category: "rails_base")
Page.rails_base
ソースコード
名前空間を付与
説明
名前空間によってグループ化
使い方
namespace(モジュール名, オプション={}, ブロック引数)
オプション
オプション | 説明 |
---|---|
:path | ルートのパスを指定 |
:module | namespaceを指定 |
:as | ルート名に使用する別名 |
:shallow_path | 指定したパラメータを先頭に追加 |
例
userにadminの名前空間を付与
namespace :admin do
resources :user
end
# admin_user_index GET /admin/user(.:format) admin/user#index
# POST /admin/user(.:format) admin/user#create
# new_admin_user GET /admin/user/new(.:format) admin/user#new
# edit_admin_user GET /admin/user/:id/edit(.:format) admin/user#edit
# admin_user GET /admin/user/:id(.:format) admin/user#show
# PUT /admin/user/:id(.:format) admin/user#update
# DELETE /admin/user/:id(.:format) admin/user#destroy
sekretと言う名のpathを指定
namespace :admin, path: "sekret" do
resources :user
end
# admin_user_index GET /sekret/user(.:format) admin/user#index
# POST /sekret/user(.:format) admin/user#create
# new_admin_user GET /sekret/user/new(.:format) admin/user#new
# edit_admin_user GET /sekret/user/:id/edit(.:format) admin/user#edit
# admin_user GET /sekret/user/:id(.:format) admin/user#show
# PUT /sekret/user/:id(.:format) admin/user#update
# DELETE /sekret/user/:id(.:format) admin/user#destroy
sekretと言う名のモジュールを指定
namespace :admin, module: "sekret" do
resources :user
end
# admin_user_index GET /admin/user(.:format) sekret/user#index
# POST /admin/user(.:format) sekret/user#create
# new_admin_user GET /admin/user/new(.:format) sekret/user#new
# edit_admin_user GET /admin/user/:id/edit(.:format) sekret/user#edit
# admin_user GET /admin/user/:id(.:format) sekret/user#show
# PUT /admin/user/:id(.:format) sekret/user#update
# DELETE /admin/user/:id(.:format) sekret/user#destroy
sekretと言う名のルート名を指定
namespace :admin, as: "sekret" do
resources :user
end
# sekret_user_index GET /admin/user(.:format) admin/user#index
# POST /admin/user(.:format) admin/user#create
# new_sekret_user GET /admin/user/new(.:format) admin/user#new
# edit_sekret_user GET /admin/user/:id/edit(.:format) admin/user#edit
# sekret_user GET /admin/user/:id(.:format) admin/user#show
# PUT /admin/user/:id(.:format) admin/user#update
# DELETE /admin/user/:id(.:format) admin/user#destroy
ソースコード
GETリクエスト
説明
GETリクエスト
使い方
get(URLパターン, 引数..)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを必ずセットで指定 |
:to | :controller, :actionの短縮形。#で区切る |
:via | HTTPメソッドを指定 |
:as | ルート名に使用する別名 |
例
GETリクエスト
get 'bacon', to: 'food#bacon'
コントローラとアクションを指定
get '/texts', controller: 'texts', action: 'index'
ソースコード
POSTリクエスト
説明
POSTリクエスト
使い方
post(URLパターン.., ブロック引数)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
:via | HTTPメソッドを指定 |
:as | ルート名に使用する別名 |
例
POSTリクエスト
post 'bacon', to: 'food#bacon'
toオプション
post '/projects/add_users', to: 'projects#add_users'
ソースコード
PATCHリクエスト
説明
PATCHリクエスト
使い方
patch(URLパターン, 引数..)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
:via | HTTPメソッドを指定 |
:as | ルート名に指定する別名 |
例
PATCHリクエスト
patch 'bacon', to: 'food#bacon'
コントローラとアクションを指定
patch 'follow' ,:controller =>'discussion_followers',:action=>'create'
ソースコード
PUTリクエスト
説明
PUTリクエスト
使い方
put(URLパターン, 引数..)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
:via | HTTPメソッドを指定 |
:as | ルート名に使用する別名 |
例
put 'bacon', to: 'food#bacon'
ソースコード
DELETEリクエスト
説明
DELETEリクエスト
使い方
delete(パス, 引数..)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
:via | HTTPメソッドを指定 |
:as | ルート名に使用する別名 |
例
DELETEリクエスト
delete 'broccoli', to: 'food#broccoli'
ルート名に使用する別名を指定
delete '/delete/:id', action: 'destroy', as: 'destroy_user'
ソースコード
HTTP OPTIONSのみを認識するルートを定義
説明
HTTP OPTIONSのみを認識するルートを定義
使い方
options(引数.., ブロック引数)
例
options 'carrots', to: 'food#carrots'
ソースコード
任意のパスを別のパスにリダイレクト
説明
任意のパスを別のパスにリダイレクト
使い方
redirect(パス.., ブロック引数)
例
リダイレクト
get "/stories" => redirect("/posts")
引数で補完
get 'docs/:article', to: redirect('/wiki/%{article}')
ブロック
get 'jokes/:number', to: redirect { |params, request|
path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
"http://#{request.host_with_port}/#{path}"
}
変更が必要なURL
get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
ソースコード
指定したパスが生成できるか確認
説明
指定したパスが生成できるか確認
assert_recognizesの逆の役割
使い方
assert_generates(パス, オプション, デフォルト={}, 追加のパラメータ={}, メッセージ=nil)
例
指定したパスが生成できるかバリデーション
assert_generates "/items", controller: "items", action: "index"
itemsコントローラにlistアクションがあるか
assert_generates "/items/list", controller: "items", action: "list"
itemsコントローラのlistアクションにid=1があるか
assert_generates "/items/list/1", { controller: "items", action: "list", id: "1" }
カスタムしたルーティング
assert_generates "changesets/12", { controller: 'scm', action: 'show_diff', revision: "12" }
ソースコード
ルーティングやオプションの確認
説明
指定したパスのルーティングやオプションの確認
assert_generatesの逆の役割
使い方
assert_recognizes(バリデーションするオプション, パス, 追加パラメータ={}, メッセージ=nil)
例
指定したパスのルーティングやオプションのバリデーション
assert_recognizes({controller: 'items', action: 'create'}, {path: 'items', method: :post})
パラメータもバリデーション
assert_recognizes({controller: 'items', action: 'list', id: '1', view: 'print'}, 'items/list/1', { view: "print" })
デフォルトのルーティング
assert_recognizes({controller: 'items', action: 'index'}, 'items')
ソースコード
リダイレクト先がどうなっているか確認
説明
リダイレクト先がどうなっているか確認
使い方
assert_redirected_to(オプション={}, メッセージ=nil)
例
リダイレクト先がどうなっているかバリデーション
assert_redirected_to controller: "weblog", action: "index"
名前付きルーティング
assert_redirected_to login_url
リダイレクト先が@customerのルーティングであるか
assert_redirected_to @customer
正規表現
assert_redirected_to %r(\Ahttp://example.org)
ソースコード
ステータスコードの確認
説明
ステータスコードの確認
使い方
assert_response(タイプ, メッセージ=nil)
タイプ名
メソッド | 説明 |
---|---|
:success | ステータスコードが200から299 |
:redirect | ステータスコードが300から399 |
:missing | ステータスコードが404 |
:error | ステータスコードが500から599 |
例
ステータスコードのバリデーション
assert_response :redirect
ステータスコードが401
assert_response 401
ソースコード
ルーティングとオプションの確認
説明
ルーティングとオプションの確認
使い方
assert_routing(パス, オプション, デフォルト={}, 追加パラメータ={}, メッセージ=nil)
例
ルーティングとオプションの確認
assert_routing '/home', controller: 'home', action: 'index'
コントローラとアクションとパラメータで生成されたルーティング
assert_routing '/entries/show/23', controller: 'entries', action: 'show', id: 23
エラーメッセージを確認
assert_routing '/store', { controller: 'store', action: 'index' }, {}, {}, 'Route for store index not generated properly'
デフォルト値を確認
assert_routing 'controller/action/9', {id: "9", item: "square"}, {controller: "controller", action: "action"}, {}, {item: "square"}
HTTPメソッドを指定
assert_routing({ method: 'put', path: '/product/321' }, { controller: "product", action: "update", id: "321" })
ソースコード
共通のルーティング定義
説明
ルーティング内などで使いまわせる共通のルーティングを定義
使い方
concern(名前, コールバック=nil, ブロック引数)
例
名前を使ってルーティングを定義
concern :purchasable, Purchasable.new(returnable: true)
ブロック
concern :commentable do |options|
resources :comments, options
end
ソースコード
名前付きのConcern
説明
名前付きのConcern
使い方
concerns(引数..)
例
resources :posts do
concerns :commentable
end
ソースコード
メンバールーティングを追加
説明
メンバールーティング(デフォルトで作成されるRESTfullなルーティング)を追加
使い方
member(ブロック引数)
例
ブロックで追加
resources :photos do
member do
get 'preview'
end
end
単体で追加
resouces :photos do
get :preview, on: :member
end
ソースコード
ルーティングにコレクションを追加
説明
ルーティングにコレクションを追加
使い方
collection(ブロック引数)
例
ブロックで追加
resources :photos do
collection do
get 'search'
end
end
単体で追加
resouces :photos do
get :search, on: :collection
end
ソースコード
カスタムURLヘルパーを定義
説明
カスタムURLヘルパーを定義
ルーティングヘルパーのデフォルトの動作を置き換えることが可能
directではnamespaceやスコープブロックないでは使用不可
使い方
direct(名前, オプション={}, ブロック引数)
例
URL指定
direct :homepage do
"https://rubyonrails.org"
end
# hogepage_urlとhogepage_pathが使えるようになる
配列を指定
direct :commentable do |model|
[ model, anchor: model.dom_id ]
end
ハッシュを指定
direct :main do
{ controller: "pages", action: "index", subdomain: "www" }
end
デフォルト引数を指定
direct :browse, page: 1, size: 10 do |options|
[ :products, options.merge(params.permit(:page, :size).to_h.symbolize_keys) ]
end
ソースコード
モデルのURLマッピングを定義
説明
モデルのURLマッピングを定義 resolveではnamespaceやスコープブロックないでは使用不可
使い方
resolve(名前.., ブロック引数)
例
resource :basket
resolve "Basket" do
[:basket]
end
# Basketモデルでlink_toが生成するパスが/baskets/:idではなく/basketに変更
ソースコード
さまざまなルート構成を簡単にテストするためのヘルパー
説明
さまざまなルート構成を簡単にテストするためのヘルパー
使い方
with_routing()
例
with_routing do |set|
set.draw do
resources :users
end
assert_equal "/users", users_path
end
ソースコード
ラックベースのアプリケーションをマウント
説明
ラックベースのアプリケーションをマウント
使い方
mount(アプリケーション, オプション=nil)
オプション
オプション | 説明 |
---|---|
:controller, :action | コントローラとアクションを指定。必ずセットで指定 |
:to | :controller, :actionの短縮形。#でコントローラとアクションを区切る |
:param | パラメータを指定 |
:path | パスを指定 |
:module | コントローラの名前空間 |
:as | ルート名に使用する別名 |
:via | HTTPメソッドを指定 |
:on | 名前付きルートを指定 |
:constraints | URLのフォーマットを制限 |
:defaults | デフォルト値 |
:anchor | アンカーリンク |
:format | フォーマットを指定 |
例
mount SomeRackApp, at: "some_route"
ソースコード
ルートのデフォルトパラメーターを設定
説明
ルートのデフォルトパラメーターを設定
使い方
defaults(デフォルトパラメータ={})
例
defaults id: 'home' do
match 'scoped_pages/(:id)', to: 'pages#show'
end
ソースコード
特定のコントローラにルートをスコープ
説明
特定のコントローラにルートをスコープ
使い方
controller(コントローラ)
例
controller "food" do
match "bacon", action: :bacon, via: :get
end
ソースコード
ルールに基づいてネストされたルートを制約
説明
ルールに基づいてネストされたルートを制約
使い方
constraints(制約={}, ブロック引数)
例
constraints(id: /\d+\.\d+/) do
resources :posts
end
ソースコード
指定されたレコードの名前付きRESTfulルートへの呼び出しを構築し結果のURL文字列を取得
説明
指定されたレコードの名前付きRESTfulルートへの呼び出しを構築し結果のURL文字列を取得
使い方
polymorphic_url(レコードのハッシュか配列, オプション={})
オプション
名前 | 説明 |
---|---|
:action | 指定されたルートのアクションプレフィックスを指定 |
:routing_type | :path または :url |
例
polymorphic_url(post) #=> "http://example.com/posts/1"
polymorphic_url([blog, post]) #=> "http://example.com/blogs/1/posts/1"
polymorphic_url([:admin, blog, post]) #=> "http://example.com/admin/blogs/1/posts/1"
polymorphic_url([user, :blog, post]) #=> "http://example.com/users/1/blog/posts/1"
polymorphic_url(Comment) #=> "http://example.com/comments"