【问题标题】:Nested attributes validations fails in parent association父关联中的嵌套属性验证失败
【发布时间】:2016-04-07 11:59:39
【问题描述】:

如果您想直接回答问题,请转到最后一段。

一个包包含许多项目,项目是多态的,其中一个链接表是 Access(因此 Access 是一个可以添加到包中的项目) 这是模型和控制器。

class Pack < ActiveRecord::Base
  has_many :pack_items, dependent: :destroy
  has_many :items_included, through: :pack_items, source: :item
  accepts_nested_attributes_for :pack_items, allow_destroy: true

  validate :valid_max_value, if: :infinite_item?
end

class Item < ActiveRecord::Base
  has_many :pack_items, dependent: :restrict_with_error
  has_many :packs, through: :pack_items
end

class Access < ActiveRecord::Base
  has_one :item, as: :itemable, dependent: :destroy
  has_one :entitlement, as: :entitlementable, dependent: :destroy
  accepts_nested_attributes_for :item, allow_destroy: true
  accepts_nested_attributes_for :entitlement, allow_destroy: true
  validate :valid_max_value, if: :infinite?

  private

  def infinite?
    entitlement.infinite
  end
end

class PacksController < BaseController
  def update
    @pack = Pack.find(params[:id])
    if @pack.update(permitted_params)
       ...
    end
  end

  private

  def permitted_params
    params.require(:pack).permit(item_attributes: [:id, :name, :max_purchasable], 
                                 pack_items_attributes: [:id, :item_id, :amount, :_destroy])
  end
end

pack“valid_max_value”中有一个重要的验证。如果一个pack内部有无限的Access,那么Pack的max_value永远不能大于1。 当我创建一个包并添加一些访问时,它可以完美运行,但问题是:

  • 我有一个包含两个项目的包。一个无限的访问和一个普通的访问(不是无限的)。所以 Pack 的 max_value 应该是 1,因为它里面有一个无限的 Access。
  • 现在我编辑该包并删除无限访问权限,因此现在我可以选择更高的 max_value,例如 5,因为该包内部没有带限制的访问权限。
  • 当我点击更新时会出现回滚,因为 valid_max_value 验证在删除无限访问之前运行,所以它说 max_value 无效,因为验证依赖于子字段。

简而言之,我的问题是:如何在运行父验证之前删除嵌套项?

【问题讨论】:

    标签: ruby-on-rails ruby nested-attributes


    【解决方案1】:

    您不必在验证之前实际删除项目,而是在验证中检查marked_for_destruction?,以便忽略要删除的项目

    【讨论】:

    • 酷!这是一个很好的方法。但是现在我该如何正确使用它呢?因为它是一个 has_many through 关联,它标记为销毁 pack_item 而不是验证中需要的项目。我可以对其进行编码以从关系中获取项目,但我想知道有更好的方法。
    • @Quin 从我的脑海中消失,这就是要走的路。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多