ViewからControllerへ配列を渡す方法【Rails】


起こった問題

viewから配列で渡すと、コントローラ側では結合された状態で渡ってしまう。

form_tag update_users_path, method: "patch" do
  = hidden_field_tag "users", users.ids
  = submit_tag "送信"

view側

> users
> [1, 2, 3, 4]

controller側

> params[:users]
> "1,2,3,4"

users = params[:users]
Users.where(id: users)

#こうなってしまう
#Users.where(id: "1,2,3,4")

これでは、idが1のuserしかとれない。

やりたいこととしては、viewからcontrollerに、全userのidが入った配列を渡したい。


> params[:users]
> [1, 2, 3, 4]

users = params[:users]
Users.where(id: users)

#これがしたい
#Users.where(id: ["1", "2", "3", "4"])

しかし、paramsで受け取る際、配列としてうまく渡らずにいろいろ試行錯誤したので備忘録として残しておきます。

joinを使って文字列の配列として渡す

前提知識として、paramsは文字列として受け取ります

joinを使って文字列を区切って渡してみましょう。

view.html.slim
form_tag update_users_path, method: "patch" do
  = hidden_field_tag "users", users.ids.join(",")
  = submit_tag "送信"

view側


> users
> "1,2,3,4"

controller側


> params[:users]
> "1,2,3,4"
> params[:users].split(",")
> ["1", "2", "3", "4"]

連結されたのでcontroller側でsplitで配列にしてあげます。
これで配列で渡したidに基づいたuserを取得することができます。



users = params[:users].split(",")
Users.where(id: users)

#Users.where(id: ["1" ,"2" ,"3" ,4"])

まとめ

viewでjoincontrollerでsplitでうまくいきました。
殴り書きなので記載ミスがあるかと思いますが、やさしくしてくれるとありがたいです。