Railsドキュメント

ルーティング(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"

ソースコード