2015-10-01 5 views
6

Ich habe folgende ModelleWie wird mit mehreren Modellen in einer Schienenform umgegangen?

class Survey < ActiveRecord::Base 
    has_many :survey_sections 
    accepts_nested_attributes_for :survey_sections 
end 

class SurveySection < ActiveRecord::Base 
    belongs_to :survey 
    has_many :questions 
    accepts_nested_attributes_for :questions 
end 

class Question < ActiveRecord::Base 
    belongs_to :survey_section 
    has_many :answers 
    belongs_to :question_group 
    accepts_nested_attributes_for :question_group 
    accepts_nested_attributes_for :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

class QuestionGroup < ActiveRecord::Base 
    has_many :questions 
end 

Mein Controller:

def new 
    @survey = Survey.new 
    survey_section = @survey.survey_sections.build 
    survey_section.questions.build 
    end 

def create 
    @survey = Survey.new(survey_params) 
    if @survey.save 
     redirect_to @survey, notice: 'Super' 
    else 
     render 'new' 
    end 
    end 

def survey_params 
     params.require(:survey).permit(:title, :description, survey_sections_attributes:[:id, :title, questions_attributes:[:id, :text, answers_attributes:[:id, :text]]]) 
    end 

Wie es möglich ist, Daten in mehr als 3 Modelle zu retten? Im Moment kann ich aus meinen Umfrageformular Daten in die Umfrage, Umfrage und Frage-Modell speichern. Aber ich weiß nicht, was ich in der Steuerung, dass ich Daten in die anderen Modelle speichern kann.

+0

Mein Vorschlag ist es, verschachtelte_Formulare zu vermeiden. Es ist so genannte Schienen Weg, aber es erhöht die Komplexität und Kupplung viel. Es ist besser, ein Formular mit ein wenig mehr Aufwand manuell zu erstellen und das Form-Objekt zu verwenden. Sie können diesen Ansatz googeln. – vladra

Antwort

11

Sie können so viele Formulare bearbeiten, wie Sie benötigen, wenn Sie den fields_for Helfer richtig verwenden.

Dies ist, wo Sie fallen, denke ich (Ihr Controller scheint in Ordnung).

Ich auch wrote an answer about this einige Zeit zurück.

#app/models/survey.rb 
class Survey < ActiveRecord::Base 
    has_many :sections 
    accepts_nested_attributes_for :sections 
end 

#app/models/section.rb 
class Section < ActiveRecord::Base 
    belongs_to :survey 
    has_many :questions 
    accepts_nested_attributes_for :questions 
end 

#app/models/question.rb 
class Question < ActiveRecord::Base 
    belongs_to :section 
    has_many :answers 
end 

Versuchen Sie, Ihre Modellnamen so kurz wie möglich zu halten.

#app/controllers/surveys_controller.rb 
class SurveysController < ApplicationController 
    def new 
     @survey = Survey.new 
     @survey.sections.build.questions.build 
    end 

    def create 
     @survey = Survey.new survey_params 
     @survey.save 
    end 

    private 

    def survey_params 
     params.require(:survey).permit(:title, sections_attributes: [:title, questions_attributes:[:title]]) 
    end 
end 

#app/views/surveys/new.html.erb 
<%= form_for @survey do |f| %> 
    <%= f.text_field :title %> 
    <%= f.fields_for :sections do |section| %> 
     <%= section.text_field :title %> 
     <%= section.fields_for :questions do |question| %> 
      <%= question.text_field :title %> 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
0

können Sie beste Erklärung bekommen hier mit derselben Art von Modell

http://railscasts.com/episodes/196-nested-model-form-part-1

#app/models/survey.rb 
class Survey < ActiveRecord::Base 
    has_many :sections, :dependent => :destroy 
    accepts_nested_attributes_for :sections, :allow_destroy => true 
end 

#app/models/section.rb 
class Section < ActiveRecord::Base 
    belongs_to :survey 
    has_many :questions, :dependent => :destroy 
    accepts_nested_attributes_for :questions, :allow_destroy => true 
end 

#app/models/question.rb 
class Question < ActiveRecord::Base 
    belongs_to :section 
    has_many :answers 
end 

jetzt in der Steuerung

def new 
    @survey = Survey.new 
    section = @survey.sections.build 
    section.questions.build 
    end 
end 

jetzt in Aussicht

<%= form_for @survey do |f| %> 
    <%= f.error_messages %> 
    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <%= f.fields_for :sections do |builder| %> 
    <%= builder.text_field :title %> 
    <%= builder.fields_for :questions do |question| %> 
     <%= question.text_field :content%> 
    <% end %> 
    <% end %> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 
Verwandte Themen