如何在一个轨道中处理多个模型?
我有以下型号
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
我的控制器:
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
如何在3个以上的模型中保存数据? 目前,我可以将调查表格数据保存到调查,调查部分和问题模型中。 但我不知道在控制器中我可以将数据保存到其他模型中。
如果正确使用fields_for
帮助程序,则可以根据需要处理fields_for
。
这就是你认为(你的控制器似乎没问题)。
一段时间后我也写了一个关于这个问题的答案 。
#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
尽量保持您的模型名称尽可能简洁。
#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 %>
您可以使用相同类型的模型获得最佳解释
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
现在在控制器中
def new @survey = Survey.new section = @survey.sections.build section.questions.build end end
现在在视图中
<%= form_for @survey do |f| %> <%= f.error_messages %> <%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :sections do |builder| %> <%= builder.text_field :title %> <%= builder.fields_for :questions do |question| %> <%= question.text_field :content%> <% end %> <% end %> <%= f.submit "Submit" %>
<% end %>