0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コントローラーへ送る値を同じ値を複数指定

Posted at

コントローラーへ送る値を同じ値を複数指定

選択したユーザーの情報をparamsで扱えるようにパラメーターを送ります。
以下のようにnew.html.erbを編集してください。

app/views/rooms/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を記述してください。

app/views/rooms/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を格納することができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?