ruby-on-rails - Rails has_many 表单可选地创建多条记录
问题描述
我有一个Profile
模型,我正在尝试查看该配置文件过去是否使用过任何其他名称。我想出了添加一个AdditionalName
模型,关联是Profile has_many AdditionalName
. 在表格中,我希望他们填写最多 5 个额外的姓名。我从这个问题中看到我可以构建它x.times
并使用它f.fields_for :additional_names
来显示 5 个额外的名称。问题是,当我提交表单时,它会保存所有 5 个,即使他们没有填写任何内容。记录是否可能AdditionalName
仅在输入字段中填写内容时才保存?
附加名称.rb
class AdditionalName < ApplicationRecord
belongs_to :profile
end
配置文件.rb
class Profile < ApplicationRecord
has_many :additional_names
accepts_nested_attributes_for :additional_names
end
控制器:
def new
existing_additional_names = @profile.additional_names.count
(5 - existing_additional_names).times do
@current_object.additional_names.build
end
形式:
<%= form_with model: @profile, url: wizard_path, method: :patch, local: true do |f| %>
<div class="form-row">
<%= f.fields_for :additional_names do |additional_names_form| %>
<%= additional_names_form.hidden_field :id %>
<div class="form-group col-md-6">
<div class="mx-auto">
<%= additional_names_form.label :name, "Full name" %>
<%= additional_names_form.text_field :name, class: "form-control", id: "ignore-button-disable" %>
</div>
</div>
<% end %>
</div>
<div class="row">
<div class="col-md-6 my-2">
<%= f.submit 'Continue', class: 'btn btn-primary w-100' %>
</div>
</div>
<% end %>
解决方案
如果您只想在设置了某个属性时才创建嵌套记录,则不需要自定义逻辑。您可以传递选项:reject_if以accepts_nested_attributes_for
使用 lambda 调用模型来处理它。
从定义:
允许您指定 Proc 或 Symbol 指向检查是否应为某个属性哈希构建记录的方法。
accepts_nested_attributes_for :additional_names,
reject_if: -> { |attributes| attributes['name'].blank? }
推荐阅读
- python - Joblib 并附加到列表
- javascript - 填充时自动生成两个重复的 ID 字段(_id 和 id)
- javascript - 推送到索引处的对象数组
- typescript - Typescript:使用泛型数组按照泛型列表的顺序创建具有泛型的对象数组
- apache-kafka - 如何在 Kafka Streams 应用程序中进行订购
- python - 使用 OpenCv 在网络摄像头上创建和捕获子区域
- c++ - 安全地传递对象的动态数组而不强制复制
- c# - C# 控制台和 PS 或 CMD 之间的脚本输出不同
- google-apps-script - 如何使用 Appscript(如链接对象)嵌入一个特别的 Slide into Google Doc?
- graphql - 如何在 Fauna 中替换多对多关系中的所有连接