2015-10-01 15 views
6

tôi có các mô hình sauLàm thế nào để xử lý nhiều mô hình trong một hình thức đường ray?

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 

điều khiển của tôi:

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 

Làm thế nào chúng ta có thể lưu dữ liệu trong hơn sau đó 3 mô hình? Hiện tại tôi có thể lưu dữ liệu biểu mẫu khảo sát của tôi vào khảo sát, phần khảo sát và mô hình câu hỏi. Nhưng tôi không biết những gì tôi có trong bộ điều khiển mà tôi có thể lưu dữ liệu vào các mô hình khác.

+0

Đề xuất của tôi là tránh sử dụng nested_forms. Nó được gọi là đường ray, nhưng nó làm tăng sự phức tạp và khớp nối rất nhiều. Tốt hơn là tạo biểu mẫu với một chút nỗ lực hơn một cách thủ công và sử dụng đối tượng Form để xử lý nó. Bạn có thể google cách tiếp cận này. – vladra

Trả lời

11

Bạn có thể xử lý nhiều biểu mẫu nếu cần, nếu bạn sử dụng trình trợ giúp fields_for đúng cách.

Đây là nơi bạn đang rơi ngắn tôi nghĩ (bộ điều khiển của bạn có vẻ ổn).

Tôi cũng wrote an answer about this một thời gian nữa.

#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 

Hãy thử và giữ cho tên mẫu của bạn gọn gàng nhất có thể.

#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

Bạn có thể nhận được lời giải thích tốt nhất ở đây với cùng một loại mô hình

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 

bây giờ trong điều khiển

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

Bây giờ trong quan điểm

<%= 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 %> 
Các vấn đề liên quan