前提
- 親モデルを登録した際に子モデルを一括登録するフォームを作っています
- slimを使っています
- Rails6系を使っています
現在Railsで親モデルのデータを1つ登録した際に、子モデルのデータを複数一括登録する機能を作っています。
子モデルの一括登録そのものはできたのですが、登録に失敗した時に新規登録ページを再描画する場面で不具合が起きています。
具体的には
- 新規登録の際(/logs/newへのアクセス)の際には正しく選択肢が表示される
- ↑の状態で何も選択しなかったり、日付や質問への答えを入力せずに登録するボタンを押すとエラーの処理が走るが、その際に再度/logs/newをレンダリングする動きがある。おそらくそこの動作のせいで、質問の後ろにあるはい、いいえの選択肢が増殖してしまう。(繰り返し増殖できてしまう)
実現したいこと
- 何も選択しなかったり、日付や質問への答えを入力せずに登録するボタンを押しても要素が増殖しないようにしたい
発生している問題・エラーメッセージ
エラーメッセージは特にないですが、おそらく、下記のコードの @log.answers.build
のbuildが複数回走ってしまっているのが原因かと思います...
該当のソースコード
ruby
1 def new 2 @user = current_user 3 @log = Log.new 4 @questions = Question.order(:id).where(is_active: true) 5 @log.answers.build 6 end 7 8 def create 9 @user = current_user 10 @log = Log.new(log_params) 11 @questions = Question.order(:id).where(is_active: true) 12 13 begin 14 @log.save! if @log.present? 15 flash[:success] = '作成しました' 16 redirect_to logs_path 17 rescue StandardError => e 18 logger.error(e) 19 flash[:danger] = @log.errors.full_messages 20 render :new 21 end 22 end
slim
1= form_with(model: log, url: url, local: true) do |f| 2 = f.hidden_field :user_id, value: user.id 3 / とりあえず固定値を渡す 4 = f.hidden_field :score, value: 40 5 .form-item 6 = f.label :registered_on, '日付' 7 = f.date_field :registered_on 8 .form-item 9 - questions.each do |question| 10 = "#{question.content}" 11 = f.fields_for :answers do |answer| 12 = answer.hidden_field :question_id, value: question.id 13 = answer.label :is_good_habit, 'はい' 14 = answer.radio_button :is_good_habit, true 15 = answer.label :is_good_habit, 'いいえ' 16 = answer.radio_button :is_good_habit, false 17 = f.submit '登録する'
試したこと
- view側でparamsなどを見て選択肢部分の表示をしないようにした(しかし、newページにアクセスした時も消えてしまうのでダメ)
- controller側で @log.answers.build の実行を paramsなどを見て行わないようにした(しかし上と同じ問題が起きてダメ)
下記5点を質問文に追加していただけないでしょうか?
・app/models/log.rb
・app/models/question.rb
・app/models/answer.rb
・db/schema.rb の logs, questions, answers 部分
・「log_params」の実装内容
