2015-10-01 25 views
6

I持って複数のモデルを1つのレール形式で扱うにはどうすればよいですか?

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つのモデルにデータを保存するには? 現時点では、私は自分のアンケートフォームデータをアンケート、調査セクション、質問モデルに保存することができます。しかし、私はコントローラーの中で、他のモデルにデータを保存することができるかどうかわかりません。

+0

私の提案は、nested_formsの使用を避けることです。これはレール方式と呼ばれていますが、複雑さと結合性が増します。少し手間をかけてフォームを作成し、それに対処するためにFormオブジェクトを使用する方がよいでしょう。あなたはこのアプローチをGoogleにすることができます。 – vladra

答えて

11

fields_forヘルパーを正しく使用する場合は、必要なだけ多くのフォームを処理できます。

これは、私が思うに(あなたのコントローラは大丈夫だと思いますが)短くなっています。

私もwrote an answer about thisいつか戻ってくる。

#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 %> 
0

あなたは、コントローラにモデル今

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 %> 
    <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 %> 
関連する問題