配列で送られてきた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で回した分を丁寧に書いたらめっちゃ見にくくなってしまった。。。むむむ