2016-07-08 49 views
0

我有一個應用程序,其中users可以創建自己的forms,然後將它們運用到自己的clients處理單選按鈕將創建一個嵌套的表格時動態

forms是動態創建的,這意味着用戶可以添加儘可能多的questions他們想要的,而且每個問題都有很多choices(想想調查結構)。

到目前爲止很好,現在我在應用表單時很掙扎,特別是在渲染edit視圖時,answers保存,保持並正常顯示。

當呈現edit視圖時,每個問題都有他們的選擇乘以answers_form有多少個問題/答案(我不確切知道他們中哪些是我在這裏猜測的)。

Answers被持久化到數據庫中,儘管每個問題都有其選擇倍增,所選答案將被檢查並在原始答案的集合中進行檢查。 (在前3個選項中選中一個,在第二個3個選項中回答兩個,在第三個3個選項中回答三個,在第三個選項中回答四個)

我已經在SO中讀過2個類似的問題,RoR nested attributes produces duplicates when editNested form update action producing duplicate results,但我已經有了強大的參數:id(您可以在下面的代碼中看到它)。

我想在這裏明確:創建窗體,嵌套的問題和嵌套的選擇工作得很好,並且還編輯創建的窗體。奮鬥是在APP中使用,回答或應用

代碼:

_form.html.erb:

<%= 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 %> 

answered_forms_controller.rb:

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 

日誌: POST:

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"} 

PATCH:

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"} 

我注意到,當POST,該id的答案是不作爲參數傳遞。如果我檢查控制檯,我可以看到答案已正確創建。

回答

0

所以問題在這行代碼:

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

fields_for輔助生成對他們來說,你在呼喚它的對象的整個集合場。

在這種情況下,@answered_form在創建後有,因此在編輯時調用fields_for時,它會爲每個問題生成4個字段。

爲了解決這個問題,你需要指定符合自己需求的收集和傳遞通過fields_for幫手:

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

0

我覺得這條線可能是問題

<% choices.each do |choice| %> 

如果你已經建立question.answers,你可以對它們進行迭代只用f.fields_for :answers並跳過上述行。我假設choicesanswers沒有太大的區別。

如果我錯了,請清除我。

+0

當用戶創建他們的「調查」('forms'),​​每個'問題'有他們自己的'選擇'(替代品)。所以,我需要將單個「問題」的每個「選擇」顯示爲一個單選按鈕。這就是爲什麼我爲每個「問題」遍歷每一個問題。 – aleherzko

+0

問題的「選擇」與問題的「答案」有何不同? –

+0

當用戶創建表單時,選擇是問題的替代方法。它們是動態創建的,這意味着每個問題可以有多個選擇,或者只有兩個選擇。答案將存儲應用相同表單時選擇的選項。但請注意,相同的形式將被應用多次,這意味着每次答案都可能不同。 – aleherzko