Rails: вложенная форма для отношения многие-к-одному
У меня есть две модели: интервью и интервьюируемый.
Существует отношение "Много к одному" между собеседованием и интервьюируемым. Я хочу иметь возможность добавить нового интервьюируемого при создании нового интервью с использованием маршрута/interviews/new
. Если интервьюируемый уже присутствовал, то вновь созданное интервью должно быть связано с ним.
Другими словами, Я хочу создать вложенную форму для отношения "belongs_to". Именно, создание родительского элемента или связывание с существующим с помощью формы для это ребенок . Вот мой код:
Интервью.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
Интервьюируемый.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
Интервью-новое.формат 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".
1 ответ:
По какой-то причине текстовое поле электронной почты для интервьюируемого не отображается в окне вид.
Вам нужно построить вложенный объект в методе
new
.def new @interview = Interview.new #2.times {@interview.interviewers.build} @interview.interviewers.build @interview.build_interviewee #here end
Так что
@interview
будет содержать атрибуты из вложенной ассоциации n, и тогда они будут доступны для построителя формВ качестве альтернативы, вы также можете сделать это, как показано ниже
<%= f.fields_for :interviewee, @interview.build_interviewee do |interviewee| %>