ruby-on-rails - 验证表单中是否存在嵌套属性

标签 ruby-on-rails ruby nested-attributes

我有以下联想:

#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 articlethis 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/

相关文章:

ruby-on-rails - Rails 嵌套属性未更新

ruby-on-rails - 如何使用 rspec 和 Ruby 测试父类(super class)方法抛出异常

sql - 我如何说服 'developers' 团队这有多糟糕?

ruby-on-rails - Rails 数据库默认值和 bool 字段的模型验证

ruby-on-rails - 如何基于 Rail 关联防止每个循环中的重复项

Ruby类加载机制

ruby - 使用 for 循环将数字相加

ruby-on-rails - 在 Rails 中将数据发送到布局的最佳实践是什么

ruby-on-rails - 具有嵌套属性的表单不保存 Rails 5

ruby-on-rails - 如何使用继承和嵌套属性构建 Rails 表单?