我有两个模特:面试和受访者。
面试与受访者之间存在多对一的关系。
我希望能够在使用/interviews/new
路线创建新面试时添加新的受访者。如果受访者已经在场,则应将新创建的面试与其联系起来。
换句话说,我想为“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 %>
出于某种原因,视图中未显示受访者的电子邮件文本框。与此同时,会显示面试官的文本框(面试中有很多人)。任何人都可以对此有所了解吗?我无法在官方的Rails“Form-helpers”指南中找到如何做到这一点。
答案 0 :(得分:2)
出于某种原因,受访者的电子邮件文本框未显示在 图。
您需要在new
方法中构建 嵌套对象。
def new
@interview = Interview.new
#2.times {@interview.interviewers.build}
@interview.interviewers.build
@interview.build_interviewee #here
end
这样@interview
将包含嵌套关联 n的属性,然后表单构建器 p>
或者,你也可以像下面这样做
<%= f.fields_for :interviewee, @interview.build_interviewee do |interviewee| %>