Rails Diary

プログラミングの学習記録です。

リクエストのパラメーター付与について

リクエストの疑問点

  • ルーティングは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名}と打つとリクエストパラメータが確認できる。 https://i.gyazo.com/2a55306ffd50e547980404a76a83f014.png

onオプション

こういう書き換えもできるらしい

get :bookmarks, on: :collection  

↑ ↓

collection do
  get :bookmarks
end