Rails:多对一关系的嵌套表单

时间:2017-07-31 13:11:04

标签: ruby-on-rails ruby ruby-on-rails-5

我有两个模特:面试和受访者。

面试与受访者之间存在多对一的关系。

我希望能够在使用/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”指南中找到如何做到这一点。

1 个答案:

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