2016-10-16 12 views
1

基本的には、アプリのようなGoogleのフォームを作っています。基本的な構造は、一度ログインしたフォームを作成できるユーザーで構成され、各フォームには複数の質問があり、複数回答。異なるビューのRuby on Railsネストされたフォーム

私がやっていることは、フォームが作成されると、そのフォームが含む(その部分は既に実装されている)質問を作成し、各フォームの表示ビュー(フォームに答えるために登録する必要はありません)回答モデルのフォームが含まれていて、それぞれの質問の回答ごとにフィールドが含まれています。

これは私がこれまで行ってきたことです。

ROUTES

devise_for :users 
    root 'forms#index' 
    resources :forms 
    post 'forms/new' 

形状モデル

class Form < ActiveRecord::Base 
    has_many :questions, dependent: :destroy 
    belongs_to :user 
    accepts_nested_attributes_for :questions, :reject_if => lambda { |a| a[:body].blank? } 
end 

QUESTIONモデル

class Question < ActiveRecord::Base 
    belongs_to :form 
    has_many :answers 
    accepts_nested_attributes_for :answers, :allow_destroy => true, :reject_if => lambda { |a| a[:body].blank? } 
end 

アンサーモデル

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 
私がネストされた属性を使用していSINCE 210

、私はFORMのCONTROLLER

class FormsController < ApplicationController 
    before_action :authenticate_user!, only: [:index] 


    def index 
     @forms = Form.all 
    end 

    def new 
     numberOfQuestions = 0 
     if params[:numberOfQuestions] 
      numberOfQuestions = params[:numberOfQuestions].to_i 
     end 
     @form = Form.new 
     numberOfQuestions.times { @form.questions.build } 
    end 


    def create 
     @form = Form.new(form_params) 
     @form.user = current_user 
     if @form.save 
      redirect_to root_path, notice: "Form correctly created" 
     else 
      render :new, notice: "Form submition failled" 
     end 
    end 

    def show 

     @form = Form.find(params[:id]) 
     questionsId = @form.questions.collect(&:id) 
     numberOfAnswers = questionsId.size 

     (0..numberOfAnswers-1).each do |i| 
      question = Question.find(questionsId[i]) 
      question.answers.build 
     end 
    end 

    def destroy 
     @form = Form.find(params[:id]).destroy 
     redirect_to root_path 
    end 

    private 
     def form_params 
      params.require(:form).permit(:title, :user_id, questions_attributes: [ :body, :id, :form_id, answers_attributes: [ :body, :id, :question_id]]) 
     end 
end 

からすべて管理しています、これは私がフォームの各質問に答えるためのフォームを表示する図であるが、私は「WHEREトラブルがあります。私のコードがある時点で

<div class="container"> 
    <div class="row"> 
     <div class="col-sm-12"> 
      <h1><%= @form.title %></h1> 
      <ol> 
       <% @form.questions.each do |question| %> 
        <li><%= question.body %></li> 
       <% end %> 
      </ol> 

      <%= form_for @form do |f| %> 

       <%= f.fields_for :questions do |builder| %> 
        <% builder.fields_for :answers do |ansBuilder| %> 
         <div class="form-group"> 
          <%= ansBuilder.text_field :body, class: "form-control", placeholder: "Answer the question" %> 
         </div> 
        <% end %> 
       <% end %> 

       <div class="form-group"> 
        <%= f.submit class: "btn btn-primary", value: "Send Answer" %> 
       </div> 
      <% end %> 
     </div> 
    </div> 
</div> 

、私はそれが(./forms/1で例えば)各フォームを表示パスに対応するフォームの質問のそれぞれのフィールドを表示するように期待していました、 Answerモデルのフォームは表示されません。あなたが何か他のものをチェックアウトしたい場合には

これは、レポのリンクです:読書のためのhttps://github.com/sebasdeldi/Formularia

おかげで多くのことを。

答えて

0

私はあなたのフォームにあなたのnewアクションが表示されるように空のanswerオブジェクトを構築する必要があると思います。このような何か:

def new 
    numberOfQuestions = 0 
    if params[:numberOfQuestions] 
     numberOfQuestions = params[:numberOfQuestions].to_i 
    end 
    @form = Form.new 
    numberOfQuestions.times do 
     question = @form.questions.build 
     3.times {question.answers.build} 
    end 
end 

ネストされた属性の場合は、コントローラは、1つまたは複数の空の子供を構築するために持っている、またはこのような場合には、孫は、フィールドがフォームに表示するために。これに関するいくつかのドキュメントと例については、Railsガイドの9.2 Nested Formsセクションを参照してください。

+0

助けてくれてありがとうございますが、あなたが提案した変更には何も起こりませんでした。 –

0

こんにちはセバスチャン・デルガド、

私はあなたのコードを見て、問題が上である: `` `

` `` あなたは存在しないプロパティにアクセスしようとしています。 あなただけがこのような最初の `field_for`取る必要があります:あなたは、各質問に対する回答を得るでしょう。これにより ` ``
  <% end %> 

      <div class="form-group"> 
       <%= f.submit class: "btn btn-primary", value: "Send Answer" %> 
      </div> 
     <% end %> 

`` `

を、オンデータを保存する前にデータを管理する必要があります。

お試しください。

関連する問題