📚
RailsでモデルのインスタンスからURLのパスを取得する仕組み
次のようにredirect_toの引数にインスタンス変数を指定する書き方について、何が行われているのかわからなかったので調べてみた。
redirect_to @book
このように、@bookというインスタンス変数でオブジェクトを渡すと、/books/:idといったパスにリダイレクトされる。
例えば@book.idが9なら、/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 >
参考リンク
Discussion