我有以下联想:
#models/contact.rb
class Contact < ActiveRecord::Base
has_many :contacts_teams
has_many :teams, through: :contacts
accepts_nested_attributes_for :contacts_teams, allow_destroy: true
end
#models/contacts_team.rb
class ContactsTeam < ActiveRecord::Base
belongs_to :contact
belongs_to :team
end
#models/team.rb
class Team < ActiveRecord::Base
has_many :contacts_team
has_many :contacts, through: :contacts_teams
end
一个联系人
应该总是有至少一个关联的团队(在contacts_teams
的富连接表中指定)。
如果用户试图在没有关联团队的情况下创建联系人:应该抛出验证。如果用户试图删除联系人的所有关联团队:应抛出验证。
我该怎么做?
我确实看过 nested attributes文档。我也看了this article和 this article这两个都有点过时了。
为了完成:我正在使用 nested_form_fields
gem 将新的关联团队动态添加到联系人。这是表格上的相关部分(有效,但目前无法验证至少有一个团队与该联系人相关联):
<%= f.nested_fields_for :contacts_teams do |ff| %>
<%= ff.remove_nested_fields_link %>
<%= ff.label :team_id %>
<%= ff.collection_select(:team_id, Team.all, :id, :name) %>
<% end %>
<br>
<div><%= f.add_nested_fields_link :contacts_teams, "Add Team"%></div>
因此,当“添加团队”未被单击时,与团队相关的参数不会传递任何内容,因此不会创建 contacts_team
记录。但是当单击“添加团队”并选择一个团队并提交表单时,会通过参数传递类似这样的内容:
"contacts_teams_attributes"=>{"0"=>{"team_id"=>"1"}}
最佳答案
在 Rails 5 中,这可以使用:
validates :contacts_teams, :presence => true
关于ruby-on-rails - 验证表单中是否存在嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187666/