リクエストのパラメーター付与について
リクエストの疑問点
- ルーティングはboardsにネストしない形で
resources :bookmarks
を記載している
(略) resources :boards do resources :comments, only: %i[create], shallow: true get :bookmarks, on: :collection end resources :bookmarks, only: %i[create destroy] end
↓boardsにネストされていないので、bookmarksはboard_idを含まないURLが出力される
bookmarks POST /bookmarks(.:format) bookmarks#create bookmark DELETE /bookmarks/:id(.:format) bookmarks#destroy
しかし、ブックマークしたかどうかの分岐において、ビューのlink_toにbookmarks_path
のみを記述してもboard_idがcreateアクションに渡らない。
<% link_to bookmarks_path, id: "js-bookmark-button-for-board-#{board.id}", method: :post do %> <%= icon 'far', 'star' %> <% end %>
↓×
def create board = Board.find(params[:board_id]) current_user.bookmark(board) redirect_back fallback_location: root_path, success: t('.success') end
どうしたら良いのか
★リクエストにはパラメータを付与することができる★
/bookmarks?board_id=1
の形でboard_idを手動で付与することができる
パス名の後に(board_id: board.id)のような形でIDを記述するとリクエストパラメータにおいて、/bookmarks?board_id=1
のように出力される。
<% link_to bookmarks_path(board_id: board.id), id: "js-bookmark-button-for-board-#{board.id}", method: :post do %> <%= icon 'far', 'star' %> <% end %>
そもそもboardにネストした方が良いのでは?
この書き方でも良いとのこと!!
resources :boards, shallow: true do resources :comments, only: %i[create] resource :bookmarks, only: %i[create destroy] get :bookmarks, on: :collection end
bookmarkにおいて必要なのはboard_idであり、自身の主キーは要らない。省略したいのでresourceと単数になっている点に注意する。
↓
board_bookmarks DELETE /boards/:board_id/bookmarks(.:format) bookmarks#destroy POST /boards/:board_id/bookmarks(.:format) bookmarks#create
board_idが含まれ、favoriteのidが省略されている。
課題の目的がリクエストにパラメータを付与できることを学ぶため、意図してこうした実装になているということだった。。
おまけ
リクエストパラメータの確認
コンソールでapp.{path名}
と打つとリクエストパラメータが確認できる。
onオプション
こういう書き換えもできるらしい
get :bookmarks, on: :collection
↑ ↓
collection do get :bookmarks end