我的完整代码可以在以下位置查看https://github.com/andyw8/simpleform_examples https://github.com/andyw8/simpleform_examples
我有一个加入模型ProductCategory
具有以下验证:
validates :product, presence: true
validates :category, presence: true
My Product
模型具有以下关联:
has_many :product_categories
has_many :categories, through: :product_categories
当我尝试创建具有类别的新产品时,调用@product.save!
在控制器中失败并显示:
Validation failed: Product categories is invalid
当我删除验证时,一切正常,并且连接模型已正确保存。
我在用着strong_parameters
但我不think这应该与这个问题有关。
这是回调链中的“竞争条件”。
当您创建产品时,它在保存之前没有任何 id,因此没有product
在范围内ProductCategory
.
Product.new(name: "modern times", category_ids:[1, 2]) #=> #<Product id: nil >
在验证的那个阶段(保存之前),ProductCatgory
无法为其外键分配任何 idproduct_id
.
这就是您进行关联验证的原因:以便验证发生在整个事务的范围内
更新:正如评论中所述,您仍然无法确保产品/类别的存在。有很多方法取决于您想要这样做的原因(例如通过某种形式直接访问 ProductCategory)
- 您可以创建一个标志
validates :product, presence: true, if: :direct_access?
- 或者如果您只能更新它们:
validates :product, presence: true, on: "update"
- 首先创建您的产品(在 products_controller 中),然后添加类别
...但事实上,这些都是简单的妥协或解决方法@product.create(params)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)