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 2

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