How to process several models in one rail form?

I have the following models

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 

My 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 

How can I save data in more than 3 models? At the moment, I can save the data of my survey form in the survey, survey section and question models. But I do not know what I need in the controller so that I can save data in other models.

+6
source share
2 answers

You can process as many forms as you need if you use the fields_for helper helper fields_for .

That's where you fall, I think (your controller looks good).

I also wrote an answer about this a while ago.

 #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 

Try to keep model names as concise as possible.

 #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 %> 
+11
source

Here you can get a better explanation with a model of the same type.

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 

now in the controller

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

Now in the views

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

All Articles