2017-07-31 61 views
2

我有兩種模型:Interview和Interviewee。Rails:多對一關係的嵌套表格

面試和被訪者之間有多對一的關係。

我希望能夠在使用/interviews/new路線創建新採訪時添加新的Interviewee。如果受訪者已經在場,則新創建的訪談應該與其相關聯。

換句話說,我想爲「belongs_to」關係創建一個嵌套表單。準確地說,創建一個父母或鏈接到一個現有的使用它的孩子的形式。這裏是我的代碼:

interview.rb

class Interview < ApplicationRecord 
belongs_to :interviewee, inverse_of: :interviews 
has_many :meetings 
has_many :interviewers, through: :meetings 
accepts_nested_attributes_for :interviewee 
accepts_nested_attributes_for :interviewers 
end 

interviewee.rb

class Interviewee < ApplicationRecord 
has_many :interviews, inverse_of: :interviewee 
end 

採訪控制器

class InterviewsController < ApplicationController 
    def index 
     @interviews = Interview.all 
    end 

    def new 
     @interview = Interview.new 
     #2.times {@interview.interviewers.build} 
     @interview.interviewers.build 
     #@interview.interviewee.build 
    end 

    def create 
     #render plain: params[:interview].inspect 
     @interview = Interview.new(interview_params) 

     @interview.save 
     redirect_to @interview 
    end 

    private 
     def interview_params 
      params.require(:interview).permit(
       :title, :date, :start_time, :end_time, 
       interviewee_attributes: [:id, :email], 
       interviewers_attributes: [:id, :email] 
      ) 
     end 
end 

採訪 - new.html.erb

<h1>Schedule a New Interview</h1> 

<%= form_for @interview, url: interviews_path do |f| %> 
    <p> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </p> 

    <p> 
    <%= f.label :date %><br> 
    <%= f.date_field :date %> 
    </p> 

    <p> 
    <%= f.label :start_time %><br> 
    <%= f.time_field :start_time %> 
    </p> 

    <p> 
    <%= f.label :end_time %><br> 
    <%= f.time_field :end_time %> 
    </p> 

    <%= f.fields_for :interviewee do |interviewee| %> 
    <p> 
     Interviewee Email:<br> 
     <%= interviewee.text_field :email %> 
    </p> 
    <% end %> 

    <%= f.fields_for :interviewers do |interviewer| %> 
    <p> 
     Interviewer Emails:<br> 
     <%= interviewer.text_area :email %> 
    </p> 
    <% end %> 

    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

由於某些原因,Interviewee的電子郵件文本框未顯示在視圖中。與此同時,Interviewers的文本框(許多與面試)顯示。任何人都可以對此有所瞭解嗎?我無法在官方的Rails「Form-Helpers」指南中找到有關如何執行此操作的信息。

回答

2

由於某種原因,Interviewee的電子郵件文本框未顯示在 視圖中。

您需要構建new方法嵌套對象

def new 
    @interview = Interview.new 
    #2.times {@interview.interviewers.build} 
    @interview.interviewers.build 
    @interview.build_interviewee #here 
end 

使@interview將包含屬性嵌套associatio n和那麼那些將可爲表單生成

或者,你也可以像下面

<%= f.fields_for :interviewee, @interview.build_interviewee do |interviewee| %> 
+0

謝謝!有效 :)。我接受這個答案。如果我想檢查具有給定屬性的受訪者(父母)是否已經存在並且只想將面試(孩子)鏈接到它,該怎麼辦?如何爲它編寫這樣的方法。 –

+0

此外,請做upvote這個問題,因爲它可能對其他也有幫助,這是在rails官方指南中沒有提到的東西:) –