首页 > 解决方案 > Rails 嵌套属性 - 并非所有验证都被触发,并且仅在更新现有记录时触发

问题描述

我有一个 Rails 5 应用程序和一个Expenditure模型:

  has_many :expenditure_items, dependent: :destroy
  accepts_nested_attributes_for :expenditure_items, allow_destroy: true

validates_associated :expenditure_items

与相关ExpenditureItems模型:

  validates :budget_item_id, presence: { message: "Budget Item required" }
  validates :cbs_item_id, presence: { message: "CBS required" }
  validates :wbs_item_id, presence: { message: "WBS required" }
  validates :description, presence: { message: "Description required" }
  validates :quantity, numericality: { message: "Quantity must be a decimal number" }
  validates :unit, numericality: { message: "Unit must be a decimal number" }

我有一个嵌套表单,我可以看到正在提交的参数:

"expenditure_items_attributes"=>{"0"=>{"budget_item_id"=>"", "wbs_item_id"=>"5", "cbs_item_id"=>"6", "description"=>"qweqwe", "quantity"=>"1.0", "unit"=>"234.00", "_destroy"=>"false", "notes"=>"", "id"=>"49"}, "1"=>{"budget_item_id"=>"5", "wbs_item_id"=>"77", "cbs_item_id"=>"5", "description"=>"TEst", "quantity"=>"1.0", "unit"=>"1000.00", "_destroy"=>"false", "notes"=>"", "id"=>"47"}}

但是控制器不会抛出budget_item_idnil 的验证错误。现在,如果我清除任何其他必填字段,验证将与验证一起触发budget_item_id(即编辑呈现,我得到浏览器验证错误)。:

"expenditure_items_attributes"=>{"0"=>{"budget_item_id"=>"", "wbs_item_id"=>"5", "cbs_item_id"=>"6", "description"=>"", "quantity"=>"1.0", "unit"=>"234.00", "_destroy"=>"false", "notes"=>"", "id"=>"49"}, "1"=>{"budget_item_id"=>"5", "wbs_item_id"=>"77", "cbs_item_id"=>"5", "description"=>"TEst", "quantity"=>"1.0", "unit"=>"1000.00", "_destroy"=>"false", "notes"=>"", "id"=>"47"}}

我知道我可以添加:

validates_associated :expenditure_items

这有效,我的表单验证但我丢失了所有嵌套的验证错误,只是得到一个通用的“无效”错误。

现在我用一个新的嵌套属性对此进行了测试,并且验证正确地触发了——所以只有当我有一个现有的记录时才会发生这种情况。

我在这里遗漏了什么明显的东西吗?

标签: ruby-on-rails

解决方案


推荐阅读