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

时间:2018-11-13 22:20:24

标签: ruby-on-rails checkbox nested-attributes

如果要在复选框列表中选中多个位置,我将尝试创建一个联系人表单,该表单可以创建联系人记录并可能创建多个位置记录。我想到要创建所有位置记录,然后再将其销毁(如果未检查)。我认为那不是最佳选择。

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

这是他们目前的样子:

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

contact_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。

非常感谢。

2 个答案:

答案 0 :(得分:0)

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

你可以有这样的东西:

<%= 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

答案 1 :(得分:0)

我最终使它与Kirti在以下问题上的建议配合使用: Rails Nested attributes with check_box loop

事实证明,我需要对表单的fields_for标签进行一些小的调整。

非常感谢您的帮助!