有两种型号
class Category < ActiveRecord::Base
has_many :products
accepts_nested_attributes_for :products, allow_destroy: true
validates_associated :products
end
class Product < ActiveRecord::Base
belongs_to :category
validate_uniqueness_of :name, scope: :category_id
end
以及类别
的表单<%= simple_form_for @category do |f| %>
<%= f.simple_fields_for :products do |p| %>
<%= render :partial => "product_fields", :locals => { :f => p } %>
<% end %>
<% end %>
正如您所看到的,有一种唯一性验证可确保产品在类别中是独一无二的。当验证未通过时,问题就开始了。
调用@category.update_attributes(params[:category])
会导致重复的表单对象。在使用错误呈现表单时,rails会创建其他关联产品,其ID为重复记录但名称不同。
例如:
鉴于我们在类别中有两种产品:面包和黄油。如果在编辑类别的产品时将Butter设置为Bread,则将创建一个新的表单对象,表单将使用Bread,Butter,Bread进行渲染,表示最后一个条目具有重复的名称。 如何防止rails创建这些重复记录?如果重要的话,我会使用rails 3.2.11。