古いバージョンのドキュメントです。最新のバージョンはRails6.0.2.1

Railsドキュメント(v5.2.4.1)

ルーティング定義

説明

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に変更

ソースコード