使用 Rails 中的嵌套属性从表单中的复选框创建多个新记录

Create multiple new records from checkboxes in form using nested attributes in Rails

如果在复选框列表中选中了多个位置,我正在尝试创建一个联系表,它可以创建联系人记录和可能的多个位置记录。我想创建所有位置记录,然后销毁它们,如果不检查的话。不过我认为这不是最佳选择。

我在模型中使用多对多关系。

这是他们现在的样子:

contact.rb

class Contact < ApplicationRecord
has_many :contact_locations, dependent: :destroy
has_many :locations, through: :contact_locations
accepts_nested_attributes_for :contact_locations, allow_destroy: true, reject_if: :empty_location?

private
def empty_location?(att)

att['location_id'].blank?

end

end

location.rb

class Location < ApplicationRecord
has_many :locations, dependent: :destroy
has_many :contacts, :through => :contact_locations
has_many :contact_locations
end

联系人_location.rb

class ContactLocation < ApplicationRecord
belongs_to :location
belongs_to :contact
end

contacts_controller.rb

def new
@contact = Contact.new
@locations = Location.all
4.times {@contact.contact_locations.new}
end

private

def contact_params
params.require(:contact).permit(:name, :phone, ..., contact_locations_attributes: [:location_ids])
end

new.html.rb

<%= form_with model: @contact do |f| %>
  ...
<%= @locations.each do |location| %>
<%= f.fields_for :contact_locations do |l| %>
<%= l.check_box :location_id, {}, location.id, nil %><%= l.label location.name %>
<% end %>
<% end %>
 ...
<% end %>

谁知道如何让它正常工作? 我正在开发 Ruby 2.5.1 和 Rails 5.2.1.

非常感谢。

我认为您的解决方案是表单对象模式。

你可以有这样的东西:

<%= form_for @user do |f| %>
  <%= f.email_field :email %>

  <%= f.fields_for @user.build_location do |g| %>
    <%= g.text_field :country %>
  <% end %>
<% end%>

并将其转换为更具可读性的内容,允许您实例化注册对象内的位置,检查复选框的值。

<%= form_for @registration do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email %>

  <%= f.input :password %>
  <%= f.text_field :password %>

  <%= f.input :country %>
  <%= f.text_field :country %>

  <%= f.input :city %>
  <%= f.text_field :city %>

  <%= f.button :submit, 'Create account' %>
<% end %>

在这里你会找到如何应用模式:https://revs.runtime-revolution.com/saving-multiple-models-with-form-objects-and-transactions-2c26f37f7b9a

我最终根据 Kirti 关于以下问题的建议使其工作: Rails Nested attributes with check_box loop

原来我需要对表单的 fields_for 标签做一些小的调整。

非常感谢帮助!