質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3024閲覧

rails のフォームの中でeachをしてsubmitしたい

iyonegaki

総合スコア19

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/07 08:38

前提・実現したいこと

実現したいことはタイトル通りでform_withのなかでeachを回して正常に動作するようにしたいです.
問題の回答画面を作成しているのですが,解答画面の中でform_withを使い,それを送信するという風にしたいと考えています.
画面は以下のようなものです.
イメージ説明

発生している問題・エラーメッセージ

eachを使うので複数のフォームが作られるのですが,送信ボタンを押してbinding.pryparamsを見ると以下のように1つしかパラメータが存在しません.

[1] pry(#<Student::AnswersController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"zR82kZIjwyWRZZwtJCU1wGneOIV/hu8YmYmecI49uRuVxIh9acjHdmF7dorCN3WpffhodQLUAVmVoPpQPG2fyA==", "danger_level"=>"1", "commit"=>"答え合わせ", "controller"=>"student/answers", "action"=>"answer_check"} permitted: false>

このときフォームは5つ存在していましたがparamsで返ってきた情報は最後のフォームの情報だけでした.

該当のソースコード

ビュー

ruby

1<div class="answer-wrapper"> 2 <h1>問題解答</h1> 3 <h4 class="answer-label-title">それぞれのユーザーに対する危険度を解答してください</h4> 4 <br> 5 <%= form_with url: student_answer_answer_check_path, local: true do |form| %> 6 <% @virtual_users.each do |virtual_user| %> 7 <p class="answer-label-title"><%= form.label :virtual_user_id, virtual_user.name %></p> 8 9 <%= form.label :danger_level, '危険度' %> 10 <%= form.select(:danger_level, [["原状情報の流出はない", 1], ["今後の投稿次第では危険", 2], ["個人情報が流出している", 3]], {prompt: "危険度を選択してください"}) %> 11 <br> 12 <br> 13 <% end %> 14 <%= form.submit "答え合わせ" %> 15 <% end %> 16</div> 17

試したこと

調べたところ,
「同じ名前のフィールドが現れると新しい要素に移ったと解釈するので、常にフィールドが送信されるテキストフィールドや hidden フィールドを先頭に持ってこなければならない」
とのことだったのでhidden_fieldを使用してみましたが特に変化がありませんでした.(自分の使い方の問題かもしれない)

わかりづらい質問かもしれませんがご助言いただければ幸いです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

パラメーターを確認してみた結果のとおり、ふつうに同じnameのフォーム要素をもたせると、値は上書きされてしまいます。

対策としては2つ考えられます。

  • フォーム要素1つごとにnameを違える
  • nameの末尾を[]として、配列の形で受け取れるようにする

投稿2021/12/07 08:59

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iyonegaki

2021/12/08 08:11 編集

maisumakunさんのおっしゃる通りにセレクトボックスのnameをそれぞれ別の名前にすることで解決できました,ありがとうございました. コードは以下のようになりました. `<%= form.select(:"danger_level[#{virtual_user.id}]", [["原状情報の流出はない", 1], ["今後の投稿次第では危険", 2], ["個人情報が流出している", 3]], {prompt: "危険度を選択してください"}) %>`
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問