リソースフルなルーティング
resources :users
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
resources :users, only: [:index]
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
resources :users, except: [:index, :edit, :update, :destroy]
Prefix Verb URI Pattern Controller#Action
users POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
user GET /users/:id(.:format) users#show
# resolveの指定がないと
# link_to('...', Book.first) のようなコードで
# books_urlが呼ばれてしまってエラーになる
# resolveで[:book]を指定することで、book_urlが呼ばれるようになる
# resolveはモデルのインスタンスから導き出す*_urlや*_pathに影響するだけで
# ルーティングには影響しない。
# なので、bin/rails routesの結果はresolveがあってもなくても同じ結果になる。
resource :book
resolve('Book') { [:book] }
Prefix Verb URI Pattern Controller#Action
new_book GET /book/new(.:format) books#new
edit_book GET /book/edit(.:format) books#edit
book GET /book(.:format) books#show
PATCH /book(.:format) books#update
PUT /book(.:format) books#update
DELETE /book(.:format) books#destroy
POST /book(.:format) books#create
# scope '/admin', as: 'admin', module: 'admin' としても同じ結果になる
namespace :admin do
resources :users
end
Prefix Verb URI Pattern Controller#Action
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
PATCH /admin/users/:id(.:format) admin/users#update
PUT /admin/users/:id(.:format) admin/users#update
DELETE /admin/users/:id(.:format) admin/users#destroy
# scope '/admin', as: 'admin', module: 'admin' としても同じ結果になる
namespace :admin do
resource :book
end
# resolveはnamespaceのブロック内で実行できない
# URLヘルパーに合わせるために[:admin, :book]にしないといけない
resolve('Book') { [:admin, :book] }
Prefix Verb URI Pattern Controller#Action
new_admin_book GET /admin/book/new(.:format) admin/books#new
edit_admin_book GET /admin/book/edit(.:format) admin/books#edit
admin_book GET /admin/book(.:format) admin/books#show
PATCH /admin/book(.:format) admin/books#update
PUT /admin/book(.:format) admin/books#update
DELETE /admin/book(.:format) admin/books#destroy
POST /admin/book(.:format) admin/books#create
# 別の記述方法
# resources :users, module: 'admin'
scope module: 'admin' do
resources :users
end
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) admin/users#index
POST /users(.:format) admin/users#create
new_user GET /users/new(.:format) admin/users#new
edit_user GET /users/:id/edit(.:format) admin/users#edit
user GET /users/:id(.:format) admin/users#show
PATCH /users/:id(.:format) admin/users#update
PUT /users/:id(.:format) admin/users#update
DELETE /users/:id(.:format) admin/users#destroy
# 別の記述方法
# resource :book, module: 'admin'
scope module: 'admin' do
resource :book
end
# resolveはscopeのブロック内で実行できない
# scope module: '...'の場合URLヘルパーにmoduleのprefixはつかないので
# :book のみでよい
resolve('Book') { [:book] }
Prefix Verb URI Pattern Controller#Action
new_book GET /book/new(.:format) admin/books#new
edit_book GET /book/edit(.:format) admin/books#edit
book GET /book(.:format) admin/books#show
PATCH /book(.:format) admin/books#update
PUT /book(.:format) admin/books#update
DELETE /book(.:format) admin/books#destroy
POST /book(.:format) admin/books#create
# 別の記述方法
# resources :users, path: '/admin'
scope '/admin' do
resources :users
end
Prefix Verb URI Pattern Controller#Action
users GET /admin/users(.:format) users#index
POST /admin/users(.:format) users#create
new_user GET /admin/users/new(.:format) users#new
edit_user GET /admin/users/:id/edit(.:format) users#edit
user GET /admin/users/:id(.:format) users#show
PATCH /admin/users/:id(.:format) users#update
PUT /admin/users/:id(.:format) users#update
DELETE /admin/users/:id(.:format) users#destroy
# 別の記述方法
# resource :book, path: '/admin'
scope '/admin' do
resource :book
end
# resolveはscopeのブロック内で実行できない
# scope '...'の場合URLヘルパーにprefixはつかないので
# :book のみでよい
resolve('Book') { [:book] }
Prefix Verb URI Pattern Controller#Action
new_book GET /admin/book/new(.:format) books#new
edit_book GET /admin/book/edit(.:format) books#edit
book GET /admin/book(.:format) books#show
PATCH /admin/book(.:format) books#update
PUT /admin/book(.:format) books#update
DELETE /admin/book(.:format) books#destroy
POST /admin/book(.:format) books#create
scope as: 'admin' do
resources :users
end
Prefix Verb URI Pattern Controller#Action
admin_users GET /users(.:format) users#index
POST /users(.:format) users#create
new_admin_user GET /users/new(.:format) users#new
edit_admin_user GET /users/:id/edit(.:format) users#edit
admin_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
# 複数形リソース
resources :users do
resources :items
resource :book
end
resolve('Book') { [:user, :book] }
Prefix Verb URI Pattern Controller#Action
user_items GET /users/:user_id/items(.:format) items#index
POST /users/:user_id/items(.:format) items#create
new_user_item GET /users/:user_id/items/new(.:format) items#new
edit_user_item GET /users/:user_id/items/:id/edit(.:format) items#edit
user_item GET /users/:user_id/items/:id(.:format) items#show
PATCH /users/:user_id/items/:id(.:format) items#update
PUT /users/:user_id/items/:id(.:format) items#update
DELETE /users/:user_id/items/:id(.:format) items#destroy
new_user_book GET /users/:user_id/book/new(.:format) books#new
edit_user_book GET /users/:user_id/book/edit(.:format) books#edit
user_book GET /users/:user_id/book(.:format) books#show
PATCH /users/:user_id/book(.:format) books#update
PUT /users/:user_id/book(.:format) books#update
DELETE /users/:user_id/book(.:format) books#destroy
POST /users/:user_id/book(.:format) books#create
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
# 単数形リソース
# link_to('...', [Book.first, User.first]) のようなコードを記述しても
# /book/users/BookのID.UserのID
# となってしまうので、
# params[:id]はBookのIDで
# params[:format]がUserのIDになる
# 素直に
# link_to('...', book_user_path(User.first))
# とした方が良い
resource :book do
resources :users
end
resolve('Book') { [:book] }
Prefix Verb URI Pattern Controller#Action
book_users GET /book/users(.:format) users#index
POST /book/users(.:format) users#create
new_book_user GET /book/users/new(.:format) users#new
edit_book_user GET /book/users/:id/edit(.:format) users#edit
book_user GET /book/users/:id(.:format) users#show
PATCH /book/users/:id(.:format) users#update
PUT /book/users/:id(.:format) users#update
DELETE /book/users/:id(.:format) users#destroy
new_book GET /book/new(.:format) books#new
edit_book GET /book/edit(.:format) books#edit
book GET /book(.:format) books#show
PATCH /book(.:format) books#update
PUT /book(.:format) books#update
DELETE /book(.:format) books#destroy
POST /book(.:format) books#create
resources :users, shallow: true do
# resource :bookがここにある場合、shallow: trueの有無に関係なく同じルーティングになる
# scope shallow_path: '...'やscope shallow_prefix: '...'がある場合は別
resources :items
end
# 別の書き方1
resources :users do
resources :items, shallow: true
end
# 別の書き方2
shallow do
resources :users do
resources :items
end
end
# 別の書き方3
resources :users do
resources :items, only: [:index, :new, :create]
end
resources :items, only: [:show, :edit, :update, :destroy]
Prefix Verb URI Pattern Controller#Action
user_items GET /users/:user_id/items(.:format) items#index
POST /users/:user_id/items(.:format) items#create
new_user_item GET /users/:user_id/items/new(.:format) items#new
edit_item GET /items/:id/edit(.:format) items#edit
item GET /items/:id(.:format) items#show
PATCH /items/:id(.:format) items#update
PUT /items/:id(.:format) items#update
DELETE /items/:id(.:format) items#destroy
scope shallow_path: 'shal' do
resources :users, shallow: true do
resources :items
# 単数形も影響を受ける
resource :book
end
end
resolve('Book') { [:user, :book] }
# 別の書き方(resoucesの中にscopeを入れても良い)
resources :users, shallow: true do
scope shallow_path: 'shal' do
resources :items
# 単数形も影響を受ける
resource :book
end
end
Prefix Verb URI Pattern Controller#Action
user_items GET /shal/users/:user_id/items(.:format) items#index
POST /shal/users/:user_id/items(.:format) items#create
new_user_item GET /shal/users/:user_id/items/new(.:format) items#new
edit_item GET /shal/items/:id/edit(.:format) items#edit
item GET /shal/items/:id(.:format) items#show
PATCH /shal/items/:id(.:format) items#update
PUT /shal/items/:id(.:format) items#update
DELETE /shal/items/:id(.:format) items#destroy
new_user_book GET /shal/users/:user_id/book/new(.:format) books#new
edit_user_book GET /shal/users/:user_id/book/edit(.:format) books#edit
user_book GET /shal/users/:user_id/book(.:format) books#show
PATCH /shal/users/:user_id/book(.:format) books#update
PUT /shal/users/:user_id/book(.:format) books#update
DELETE /shal/users/:user_id/book(.:format) books#destroy
POST /shal/users/:user_id/book(.:format) books#create
# link_to('...', [:shal, Item.first])のような指定をしなければいけない
scope shallow_prefix: 'shal' do
resources :users, shallow: true do
resources :items
# 単数形も影響を受ける
resource :book
end
end
# 別の書き方(resoucesの中にscopeを入れても良い)
resources :users, shallow: true do
scope shallow_prefix: 'shal' do
resources :items
# 単数形も影響を受ける
resource :book
end
end
Prefix Verb URI Pattern Controller#Action
shal_user_items GET /users/:user_id/items(.:format) items#index
POST /users/:user_id/items(.:format) items#create
new_shal_user_item GET /users/:user_id/items/new(.:format) items#new
edit_shal_item GET /items/:id/edit(.:format) items#edit
shal_item GET /items/:id(.:format) items#show
PATCH /items/:id(.:format) items#update
PUT /items/:id(.:format) items#update
DELETE /items/:id(.:format) items#destroy
new_shal_user_book GET /users/:user_id/book/new(.:format) books#new
edit_shal_user_book GET /users/:user_id/book/edit(.:format) books#edit
shal_user_book GET /users/:user_id/book(.:format) books#show
PATCH /users/:user_id/book(.:format) books#update
PUT /users/:user_id/book(.:format) books#update
resources :users, only: [:new] do
# URLヘルパーだけget :foo, on: :memberと書いた場合と異なる
get :foo
get :preview, on: :new
# patch :disable, on: :member でも同じ
member do
patch :disable
end
# post :bulk_insert, on: :collection でも同じ
collection do
post :bulk_insert
end
end
Prefix Verb URI Pattern Controller#Action
user_foo GET /users/:user_id/foo(.:format) users#foo
preview_new_user GET /users/new/preview(.:format) users#preview
disable_user PATCH /users/:id/disable(.:format) users#disable
bulk_insert_users POST /users/bulk_insert(.:format) users#bulk_insert
new_user GET /users/new(.:format) users#new
resource :book, only: [:new] do
# member, collectionの区別がないので
# on: :memberやon: :collectionがあってもなくてもでも同じ結果になる
get :bar
get :preview, on: :new
member do
patch :disable
end
collection do
post :bulk_insert
end
end
resolve('Book') { [:book] }
Prefix Verb URI Pattern Controller#Action
bar_book GET /book/bar(.:format) books#bar
preview_new_book GET /book/new/preview(.:format) books#preview
disable_book PATCH /book/disable(.:format) books#disable
bulk_insert_book POST /book/bulk_insert(.:format) books#bulk_insert
new_book GET /book/new(.:format) books#new
# 単にコントローラーをモジュールに入れたいだけなら、
# scope module: '...'を使うべき
resources :users, controller: 'admin/accounts'
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) admin/accounts#index
POST /users(.:format) admin/accounts#create
new_user GET /users/new(.:format) admin/accounts#new
edit_user GET /users/:id/edit(.:format) admin/accounts#edit
user GET /users/:id(.:format) admin/accounts#show
PATCH /users/:id(.:format) admin/accounts#update
PUT /users/:id(.:format) admin/accounts#update
DELETE /users/:id(.:format) admin/accounts#destroy
# pathやmoduleと異なり、scope as: '...'とは結果が異なるので注意
resources :users, as: 'accounts'
Prefix Verb URI Pattern Controller#Action
accounts GET /users(.:format) users#index
POST /users(.:format) users#create
new_account GET /users/new(.:format) users#new
edit_account GET /users/:id/edit(.:format) users#edit
account GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
# newとedit以外はURIに出てこないので指定しても効果はない
resources :users, path_names: { new: 'make', edit: 'change' }
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/make(.:format) users#new
edit_user GET /users/:id/change(.: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
リソースフルでないルーティング
# method 'パス名', to: 'コントローラー#アクション'
# のフォーマットで指定する
# パス名内部の`:id`などはparams[:id]に対応する
get 'users/:id', to: 'accounts#show'
Prefix Verb URI Pattern Controller#Action
GET /users/:id(.:format) accounts#show
get 'users/:id', to: 'accounts#show', as: :account
Prefix Verb URI Pattern Controller#Action
account GET /users/:id(.:format) accounts#show
get 'users/:id', to: 'accounts#show', as: :account
# 一時的なリダイレクトにしたければ、
# redirect('users/:id', status: 302)とする
get 'accounts/:id', to: redirect('users/:id')
Prefix Verb URI Pattern Controller#Action
account GET /users/:id(.:format) accounts#show
GET /accounts/:id(.:format) redirect(301, users/:id)
root 'users#show'
namespace :admin do
root 'users#show'
end
Prefix Verb URI Pattern Controller#Action
root GET / users#show
admin_root GET /admin(.:format) admin/users#show