【问题标题】:Rails: Nested form for many-to-one relationRails:多对一关系的嵌套形式
【发布时间】:2017-07-31 21:22:20
【问题描述】:

我有两个模型:Interview 和Interviewee。

Interview 和Interviewee 之间存在多对一的关系。

我希望能够在使用/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”指南中找不到有关如何执行此操作的信息。

【问题讨论】:

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


    【解决方案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| %>
    

    【讨论】:

    • 谢谢!有效 :)。我接受这个答案。如果我想检查具有给定属性的受访者(父母)是否已经存在并且只想将采访(孩子)链接到它怎么办?如何为它编写这样的方法。
    • 另外,请对这个问题投赞成票,因为它可能对其他人也有帮助,而且它在 Rails 官方指南中没有提到 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多