ruby-on-rails - 如果对象在 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
不存在,则用户必须通过输入此人的姓名和年龄来手动输入此人的信息。
如何设置控制器和表单以允许用户手动输入人员的姓名和年龄,然后在保存培训时在嵌套表单字段中自动创建该人员和出勤?
解决方案
关键是有一个id
嵌套属性的字段。Rails 的行为是如果 存在则更新现有记录,或者如果为空白id
则创建新记录。id
从本质上讲,这就是您需要做的所有事情。输入此人的姓名和年龄,但id
留空,将创建一条新记录。
我强烈推荐cocoon
gem https://github.com/nathanvda/cocoon它将link_to_add_association
为您的培训表格提供帮助,自动让您打开一个新的空人表格。实施后,您将使用类似这样的方法调用帮助程序
<%= link_to_add_association 'add attendee', f, :people %>
您可以忽略此人通过联接表与培训相关联...当您保存新人员时,rails 将自动创建联接记录。