4
5

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 5 years have passed since last update.

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

Posted at

##起こった問題
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でうまくいきました。
殴り書きなので記載ミスがあるかと思いますが、やさしくしてくれるとありがたいです。

4
5
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
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?