📚

RailsでモデルのインスタンスからURLのパスを取得する仕組み

2022/01/23に公開

次のようにredirect_toの引数にインスタンス変数を指定する書き方について、何が行われているのかわからなかったので調べてみた。

redirect_to @book

このように、@bookというインスタンス変数でオブジェクトを渡すと、/books/:idといったパスにリダイレクトされる。
例えば@book.id9なら、/book/9となる。

これは、リソースフルルーティングと呼ばれる仕組みによって実現されている。

route.rb
Rails.application.routes.draw do
  resources :books
end

resourcesメソッドを使って上記のように定義すると、以下のルーティングが作成される。
(rails routesコマンドで確認)

Prefix Verb URI Pattern Controller#Action
books GET /books(.:format) books#index
POST /books(.:format) books#create g
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy

redirect_to @bookは、実際にはbook_pathというヘルパーメソッドを呼び出してリダイレクトが行われる。(_pathのプレフィクスがbook)

redirect_to book_path(@book)

つまり、@bookに格納されているオブジェクト(インスタンス)を元にURLが生成され、リダイレクト先が自動的に決まる。この場合、books#showアクションが呼び出される。

また、link_toでも同様に書ける。

<%= link_to 'Book', @book >

参考リンク

https://railsguides.jp/routing.html
https://api.rubyonrails.org/v7.0/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-resources
https://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to

GitHubで編集を提案

Discussion