应用于动态创建的嵌套表单时处理单选按钮

时间:2016-07-08 01:09:01

标签: ruby-on-rails ruby-on-rails-4

我有一个应用,其中users可以创建自己的forms,然后将它们应用到自己的clients

forms是动态创建的,这意味着用户可以添加他们想要的questionschoices,每个问题都有很多answers(想想调查结构)。

到目前为止一切顺利,现在我在应用表单时遇到了困难,特别是在呈现edit视图时保持edit已保存,保持并正确显示。

在呈现Answers视图时,每个问题都有他们的选择乘以answers_form有多少个问题/答案(我不确切地知道他们中的哪一个,我猜这里)。

:id被持久化到数据库,虽然每个问题都有他们的选择相乘,但选中的答案会被检查并在原始答案的集合中进行检查。 (在前3个选项中回答一个,在第3个选择中回答2个,在第3个选择中回答3个,在第3个选择中回答4个)

我已经在SO,RoR nested attributes produces duplicates when editNested form update action producing duplicate results中阅读了2个类似的问题,但我已经在强参数中有<%= form_for [@child, @answered_form] do |f| %> <%= f.hidden_field :form_id %> <%= f.hidden_field :child_id %> <div class="answered_form"> <h1><%= @form.f_title %></h1> <h3><%= @form.f_description %></h3> <br> <% questions = @form.questions %> <% i = 1 %> <% questions.each do |question| %> <%= i.to_s + ". " %><%= question.q_title %> <br /> <% choices = question.choices %> <%= f.fields_for :answers do |a| %> <% choices.each do |choice| %> <%= a.radio_button :a_content, choice.c_description %> <%= a.label :a_content, choice.c_description, :value => choice.c_description, class: 'no-margin' %> <br /> <% end %> <% end %> <br /> <% i += 1 %> <% end %> </div> <div class="text-center"> <%= f.submit yield(:button_text), class: "btn btn-primary btn-lg" %> </div> <% end %> (您可以在代码中看到它)下文)。

我想在这里说清楚:创建表单,嵌套问题和嵌套选项工作得非常好,还可以编辑创建的表单。斗争是在APP中使用,回答或应用时。

  

代码:

_form.html.erb:

class AnsweredFormsController < ApplicationController
  before_action :correct_answered_form,  only: [:edit, :update, :destroy]

  def new
    @child = current_user.children.find(params[:child_id])
    @form = current_user.forms.find(params[:form_id])
    @answered_form = @child.answered_forms.new(form_id: params[:form_id])
    @answered_form.answers.build
  end

  def create
    @answered_form = AnsweredForm.create(answered_form_params)
    if @answered_form.save
      flash[:success] = "New survey " + @answered_form.form.f_title + " applied to patient!"
      redirect_to current_user.children.find(params[:child_id])
    else
      render 'new'
    end
  end

  def edit
    @child = current_user.children.find(params[:child_id])
    @form = current_user.forms.find(params[:form_id])
  end

  def update
    if @answered_form.update_attributes(answered_form_params)
      flash[:success] = "Survey updated!"
      redirect_to @answered_form.child
    else
      render 'edit'
    end
  end

  def show
  end

  def destroy
    @child = current_user.children.find(params[:child_id])
    @form = current_user.forms.find(params[:form_id])
    @answered_form.destroy
    redirect_to :back
  end

  private

    # Strong params for creating and updating forms
    def answered_form_params
      params.require(:answered_form).permit(:form_id, :child_id, answers_attributes: [:id, :a_content, :a_boolean, :_destroy, :choice_id])
    end

    # Confirms the correct answered_form
    def correct_answered_form
      @answered_form = AnsweredForm.find(params[:id])
    end

end

answered_forms_controller.rb:

Started POST "/children/1-juan-gomez-pereira/answered_forms" for ::1 at 2016-07-08 11:55:01 -0400
Processing by AnsweredFormsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"hFrRfEwVG4XSkdbPwrohm1QEQ0FtE/as3sM2Fj3Av3reVHJxZBVKPeuAeD713H7gVyZn7eppnULDhLJQz+EBeg==", "answered_form"=>{"form_id"=>"1", "child_id"=>"1", "answers_attributes"=>{"0"=>{"a_content"=>"Bajo"}, "1"=>{"a_content"=>"Sí"}, "2"=>{"a_content"=>"Derecha"}, "3"=>{"a_content"=>"Pesado"}}}, "commit"=>"Aplicar", "child_id"=>"1-juan-gomez-pereira"}

日志: 的 POST:

Started PATCH "/children/1-juan-gomez-pereira/answered_forms/3" for ::1 at 2016-07-08 11:55:54 -0400
Processing by AnsweredFormsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"oGdqgUR95HMkMff40Gq1zWar/CH64F0jsN3oRHT1q/H6acmMbH21yx0gWQnnDOq2ZYnYjX2aNs2tmmwChtQV8Q==", "answered_form"=>{"form_id"=>"1", "child_id"=>"1", "answers_attributes"=>{"0"=>{"a_content"=>"Bajo", "id"=>"9"}, "1"=>{"a_content"=>"Bajo", "id"=>"10"}, "2"=>{"a_content"=>"Bajo", "id"=>"11"}, "3"=>{"a_content"=>"Confuso", "id"=>"12"}, "4"=>{"a_content"=>"No", "id"=>"9"}, "5"=>{"a_content"=>"Sí", "id"=>"10"}, "6"=>{"a_content"=>"Confuso", "id"=>"11"}, "7"=>{"a_content"=>"Confuso", "id"=>"12"}, "8"=>{"a_content"=>"Confuso", "id"=>"9"}, "9"=>{"a_content"=>"Izquierda", "id"=>"10"}, "10"=>{"a_content"=>"Confuso", "id"=>"11"}, "11"=>{"a_content"=>"Izquierda", "id"=>"12"}, "12"=>{"a_content"=>"Liviano", "id"=>"9"}, "13"=>{"a_content"=>"Liviano", "id"=>"10"}, "14"=>{"a_content"=>"Pesado", "id"=>"11"}, "15"=>{"a_content"=>"Liviano", "id"=>"12"}}}, "commit"=>"Actualizar", "child_id"=>"1-juan-gomez-pereira", "id"=>"3"}

PATCH:

id

我注意到在POST时,答案的{{1}}不作为参数传递。如果我检查控制台,我可以看到答案是正确创建的。

2 个答案:

答案 0 :(得分:0)

我认为这一行可能是问题

<% choices.each do |choice| %>

如果您已构建question.answers,则只能使用f.fields_for :answers对其进行迭代,并跳过上述行。我认为choicesanswers没有多大区别。

如果我错了,请告诉我。

答案 1 :(得分:0)

So the problem was in this line of the code:

<%= f.fields_for :answers do |a| %>

fields_for helper generates fields for the entire collection of the object for whom your are calling it.

In this case, @answered_form had 4 answers after creating it, so when calling fields_for in edit, it was generating 4 fields set for each question.

To solve this, you need to specify a collection that fits your needs and pass it through the fields_for helper:

<%= f.fields_for :answers, ANSWERS_COLLECTION do |a| %>