LoginSignup
0
0

More than 1 year has passed since last update.

フォームからパラメータとしてコントローラーに値を送る方法

Posted at

プルダウンで選択したユーザーの情報をparamsで扱えるようにパラメーターを送ります。


<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は以下のようになります。

{"room" => {"user_ids" => ["選択したユーザーのid"]}}

room[user_ids]という記述は値としてハッシュをさらに入れ子にすることを示しています。
room[user_ids]で送られるparamsの中身↓

{"room" => {"user_ids" => "値"}}

次に、末尾の[]の記述はキーに対する値を配列として格納することを示しています。これにより1つのキーに対して、複数の値を受け取ることができます。
room[user_ids][]で送られるparamsの中身↓

{"room" => {"user_ids" => ["値"]}}

以上の仕組みを利用して、選択したユーザーの情報をコントローラーへ送信できました。

しかし、現状のままですと現在ログインしているユーザーのidをparamsで送信することができていません。
(User.where.not(id: current_user.id)としているためです。)
現在ログイン中のユーザーのidも一緒にparamsでコントローラーへ送信できるように以下の記述を追加しました。

<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 %>>

type属性に"hidden"を指定することで画面上には表示されないinput要素を作成できます。
name属性に"room[user_ids][]"を指定し、value属性にはcurrent_user.idを指定しています。
この記述で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