使用 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 标签做一些小的调整。
非常感谢帮助!
如果在复选框列表中选中了多个位置,我正在尝试创建一个联系表,它可以创建联系人记录和可能的多个位置记录。我想创建所有位置记录,然后销毁它们,如果不检查的话。不过我认为这不是最佳选择。
我在模型中使用多对多关系。
这是他们现在的样子:
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 标签做一些小的调整。
非常感谢帮助!