📚
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