繁体   English   中英

Rails 自定义验证方法

[英]Rails custom validate method

我正在使用祖先 gem来创建子类别。 之后,当我创建一个项目(项目模型)时,我使用以下组 select 将项目与其所属的子类别相关联。 select 组具有组合在一起的类别和子类别。

<%= form.input :category, collection: @categories, as: :grouped_select, group_method: :children, label: false, include_blank: true %>

@categories = Category.where(ancestry: nil).order('name ASC')

此外,我正在使用茧宝石来创建许多子类别并将其关联到一个项目。

现在我想在 model 中添加一个自定义validate方法,这将允许用户仅添加属于同一主类别的子类别,否则会返回错误:

errors.add(:category, "you can only choose subcategories from he same category")   

我有点坚持如何创建这个validate方法。 也许首先我应该找到正在添加的子类别:

subcategory = Category.find(category)

然后用这个找到子类别所属的类别:

subcategory.root.name

但在那之后,我现在知道该怎么做。

如何创建此validate方法以允许用户仅添加属于同一主类别的子类别,或者返回错误?

先感谢您。 非常感谢您对此提供帮助。

如果我理解,分配给项目的所有类别都必须是同一类别的子类别。 我认为它们必须是子类别。

在 Item 中编写一个自定义验证方法,验证所有子类别都有父类别,并且所有子类别都相同。

class Item < ApplicationRecord
  has_many categories

  validate :categories_have_the_same_parent

  private def categories_have_the_same_parent
    if categories.any? { |cat| !cat.ancestry_id }
      errors.add(
        :categories,
        :not_a_subcategory,
        "All categories must be sub-categories"
      )
    end

    if categories.each_cons(2).any? { |a,b| a.ancestry_id != b.ancestry_id }
      errors.add(
        :categories,
        :different_ancestors,
        "All categories must have the same parent."
      }
    end
  end
end

可以改进对此的诊断以包括违规类别。

然后,在表单中,使用表单信息填充 Item 并正常检查 Item 的验证。

class ItemController < ApplicationController
  def create
    @item = Item.create!(...params...)

    ...creation succeeded...
  rescue ActiveRecord::RecordInvalid => e
    ...creation failed...
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM