首页 > 解决方案 > 如果对象在 Rails 6 中以嵌套形式不存在,如何创建对象?

问题描述

我需要创建一个Training,然后Attendances在 Rails 6 应用程序中添加嵌套表单字段(茧)。情况如下:

型号如下:

训练模型

class Training < ApplicationRecord  
  has_many :attendances, dependent: :destroy
  has_many :people, through: :attendances
  accepts_nested_attributes_for :attendances, reject_if: :all_blank, allow_destroy: true
end

考勤模式

class Attendance < ApplicationRecord
  belongs_to :training
  belongs_to :person
end

人物模型

class Person < ApplicationRecord
  has_many :attendances, dependent: :destroy
  has_many :trainings, through: :attendances
end

如果Person数据库中存在a,则用户从下拉选择字段中选择人名。

如果Person不存在,则用户必须通过输入此人的姓名和年龄来手动输入此人的信息。

如何设置控制器和表单以允许用户手动输入人员的姓名和年龄,然后在保存培训时在嵌套表单字段中自动创建该人员和出勤?

标签: ruby-on-railsnested-formscocoon-gem

解决方案


关键是有一个id嵌套属性的字段。Rails 的行为是如果 存在则更新现有记录,或者如果为空白id则创建新记录。id

从本质上讲,这就是您需要做的所有事情。输入此人的姓名和年龄,但id留空,将创建一条新记录。

我强烈推荐cocoongem https://github.com/nathanvda/cocoon它将link_to_add_association为您的培训表格提供帮助,自动让您打开一个新的空人表格。实施后,您将使用类似这样的方法调用帮助程序

<%= link_to_add_association 'add attendee', f, :people %>

您可以忽略此人通过联接表与培训相关联...当您保存新人员时,rails 将自动创建联接记录。


推荐阅读