コントローラーへ送る値を同じ値を複数指定
選択したユーザーの情報をparamsで扱えるようにパラメーターを送ります。
以下のようにnew.html.erbを編集してください。
<!-- 中略 -->
<select name="room[user_ids][]">
<option value="">チャットするユーザーを選択してください</option>
<% User.where.not(id: current_user.id).each do |user| %>
<option value=<%= user.id %>><%= user.name %></option>
<% end %>
</select>
<!-- 中略 -->
select要素のname属性にroom[user_ids][]を指定し、option要素のvalue属性にuser.idを指定しました。このように記述することで、これまでとは異なる形でパラメーターが送信されるため、paramsは以下のようになります。
【例】paramsの中身
# room[user_ids][ ]で送られるパラメーター
{"room" => {"user_ids" => ["選択したユーザーのid"]}}
この記述について、name属性のroom[user_ids][]を、room[user_ids]と[]に分けて説明します。
まず、room[user_ids]という記述は、キーに対する値という通常のパラメーターと異なり、値としてさらにハッシュを入れ子にすることを示すものです。
【例】room[user_ids]で送られるparamsの中身
{"room" => {"user_ids" => "値"}}
続いて、末尾についた[]について説明します。この記述は、キーに対する値を配列として格納することを示すものです。これにより、1つのキーに対して、複数の値を受け取ることができるようになります。
【例】room[user_ids][]で送られるparamsの中身
{"room" => {"user_ids" => ["値"]}}
以上の仕組みを利用して、選択したユーザーの情報をコントローラーへ送信する仕組みができました。
しかし、現状の実装のままでは、現在ログインしているユーザーのidを送信することができず、送信したユーザーのみチャットルームに存在していることになってしまいます。
したがって、現在ログイン中のユーザーのidも一緒に、paramsでコントローラーへ送信できるよう実装します。
パラメーターにログイン中ユーザーのidも含めましょう
以下のようにnew.html.erbを記述してください。
<!-- 中略 -->
<select name="room[user_ids][]">
<option value="">チャットするユーザーを選択してください</option>
<% User.where.not(id: current_user.id).each do |user| %>
<option value=<%=user.id%>><%= user.name %></option>
<% end %>
</select>
<input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>>
<!-- 中略 -->
この記述で、現在ログイン中のユーザーが持つidをparamsに含めることができます。
<input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>>
type属性にhiddenを指定することで、画面上には表示されないinput要素を作成できます。そして、先ほどのselect要素と同様、name属性にroom[user_ids][]を指定し、room[user_ids]をキーに対する値を配列で受け取る仕組みです。value属性にはcurrent_user.idを指定しているため、room[user_ids]キーに対して、ログイン中ユーザーのidを配列として格納し、コントローラーへ送信します。
この記述の結果、コントローラーに送られるparamsは以下のようになります。
【例】room[user_ids][]で送られるparamsの中身
{"room" => {"user_ids" => ["選択したユーザーのid", "現在ログインしているユーザーのid"]}}
room[user_ids]に2種類のユーザーidを格納することができました。