ルーティング定義
説明
URLとアプリケーションのパラメータを結びつける仕組み
説明
- 設定ファイルは、「config/routes.rb」
- 優先順位は、上から順
デフォルトの設定
match ':controller(/:action(/:id(.:format)))'
- http:// ホスト名:ポート番号/:controller/:action/:id
- params[:id]でパラメータidの値を取得
ルーティングの内容を確認
説明
設定されているルーティングの内容を確認
使い方
$ rake routes
例
ルーティングの内容を確認
$ rake routes
Prefix Verb URI Pattern Controller#Action
xxxes GET /xxxes(.:format) xxxes#index
POST /xxxes(.:format) xxxes#create
new_xxx GET /xxxes/new(.:format) xxxes#new
edit_xxx GET /xxxes/:id/edit(.:format) xxxes#edit
xxx GET /xxxes/:id(.:format) xxxes#show
PATCH /xxxes/:id(.:format) xxxes#update
PUT /xxxes/:id(.:format) xxxes#update
DELETE /xxxes/:id(.:format) xxxes#destroy
ルートを定義
説明
アクセス可能なURLを指定することで、HTMLリクエストを処理
使い方
match(URLパターン [, オプション])
オプション
オプション | 説明 |
---|---|
: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(:リソース名 [, オプション])
生成されるルート
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 |
オプション
オプション | 説明 |
---|---|
:as | ルート名に利用する別名 |
:controller | コントローラを指定 |
:path_names | 指定したアクションのみ名前の変更 |
:path | URLを書き換える |
:only | 生成されるURLを絞り込む |
:except | 指定したURLは生成しない |
:shallow | ルーティングを複雑化しない |
:shallow_path | 指定したパラメータを先頭に追加 |
:shallow_prefix | 指定したパラメータを名前付きルーティングとして先頭に追加 |
:format | フォーマット指定 |
例
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(リソース名 [, オプション])
生成されるルート
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 |
オプション
オプション | 説明 |
---|---|
:as | ルート名に利用する別名 |
:controller | コントローラを指定 |
:path_names | 指定したアクションのみ名前の変更 |
:path | URLを書き換える |
:only | 生成されるURLを絞り込む |
:except | 指定したURLは生成しない |
:shallow | ルーティングを複雑化しない |
:shallow_path | 指定したパラメータを先頭に追加 |
:shallow_prefix | 指定したパラメータを名前付きルーティングとして先頭に追加 |
:format | フォーマット指定 |
:param | パラメータを上書き |
例
単一のリソースを定義
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(スコープ名, 条件式)
例
rails_baseカテゴリのデータだけを取得するスコープ
scope :rails_base, where(category: "rails_base")
Page.rails_base
ソースコード
名前空間を付与
説明
名前空間によってグループ化
使い方
namespace モジュール名 [, オプション] do
ルート定義
end
オプション
オプション | 説明 |
---|---|
: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リクエスト
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'
ソースコード
指定したパスが生成できるかバリデーション
説明
指定したパスが生成できるかバリデーション
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(バリデーションするオプション, パス, 追加パラメータ, メッセージ)
例
指定したパスのルーティングやオプションのバリデーション
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([オプション, メッセージ])
例
リダイレクト先がどうなっているかバリデーション
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(タイプ [, メッセージ])
タイプ名
メソッド | 説明 |
---|---|
: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(名前, [コールバック])
例
名前を使ってルーティングを定義
concern :purchasable, Purchasable.new(returnable: true)
ブロック
concern :commentable do |options|
resources :comments, options
end
ソースコード
メンバールーティングを追加
説明
メンバールーティング(デフォルトで作成されるRESTfullなルーティング)を追加
使い方
resources XXX do
member do
追加したいルーティング
end
end
例
ブロックで追加
resources :photos do
member do
get 'preview'
end
end
単体で追加
resouces :photos do
get :preview, on: :member
end
ソースコード
カスタムURLヘルパーを定義
説明
カスタムURLヘルパーを定義
ルーティングヘルパーのデフォルトの動作を置き換えることが可能
directではnamespaceやスコープブロックないでは使用不可
使い方
direct(名前 [, オプション]) do
定義内容
end
例
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(名前) do
定義内容
end
例
モデルのURLマッピングを定義
resource :basket
resolve "Basket" do
[:basket]
end
# Basketモデルでlink_toが生成するパスが/baskets/:idではなく/basketに変更