LoginSignup
5
4

More than 5 years have passed since last update.

配列で送られてきたparamsの取り出し方

Posted at

配列で送られてきたparamsの取り出し方

formなどで子要素などを親要素のparamsの中に配列で入れて送った場合など

取り出したいparams

"questions"=>[
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]},
{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}
]
送られてきたparamsの説明
  • 質問(question/親)は二つ
  • 各質問に対して二個ずつ選択肢(question_choice/子)を設定
  • 質問と選択肢は一つのフォームでまとめて送るようにしてある

取り出し方&DBへの保存の仕方

questions_require.each do |question_require|
  question_params = question_require.permit(:content)
  question = Question.new(question_params)

  question_choices_require = question_require[:question_choices]

  question_choices_require.each do |question_choice_require|
    question_choice_params = question_choice_require.permit(:content)
    question.question_choices.build(question_choice_params)
  end
end


private

def questions_require
  params.require(:questions)
end
説明
  • まずquestions_requireで
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]},
{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}

を取り出してくる

  • question_requireで
{"content"=>"質問1",
"question_choices"=>[
{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}
]}

{"content"=>"質問2",
"question_choices"=>[
{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}
]}

をそれぞれeachで回して取り出してくる

  • question_require.permit(:content)で
"content"=>"質問1"

"content"=>"質問2"

をそれぞれeachで回してpermit
->これでちゃんとストロングパラメータが書けたのでQuestion.newできる

  • 次に question_choices_require = question_require[:question_choices]で
[{"content"=>"選択肢1.1"}, {"content"=>"選択肢1.2"}]

[{"content"=>"選択肢2.1"}, {"content"=>"選択肢2.2"}]

をeachで回して取り出してくる

  • question_choice_require.permit(:content)で
"content"=>"選択肢1.1"

"content"=>"選択肢1.2"

"content"=>"選択肢2.1"

"content"=>"選択肢2.2"

をそれぞれeachで回してpermit
=>これでストロングパラメータがちゃんと書けたのでbuildできる

eachで回した分を丁寧に書いたらめっちゃ見にくくなってしまった。。。むむむ

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