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

标签: ruby-on-railsforms

解决方案


如果您只想在设置了某个属性时才创建嵌套记录,则不需要自定义逻辑。您可以传递选项:reject_ifaccepts_nested_attributes_for使用 lambda 调用模型来处理它。

从定义:

允许您指定 Proc 或 Symbol 指向检查是否应为某个属性哈希构建记录的方法。

 accepts_nested_attributes_for :additional_names,
                               reject_if: -> { |attributes| attributes['name'].blank? }

推荐阅读