Rails 自定义验证方法
Rails custom validate method
我正在使用 ancestry 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')
此外,我还使用 cocoon gem 来创建多个子类别并将其关联到一个项目。
现在我想在模型中添加一个自定义validate
方法,这将允许用户只添加属于同一主类别的子类别,否则return一个错误:
errors.add(:category, "you can only choose subcategories from he same category")
我对如何创建这个 validate
方法有些困惑。也许首先我应该找到正在添加的子类别:
subcategory = Category.find(category)
然后用这个找到子类别所属的类别:
subcategory.root.name
但在那之后我现在知道该怎么做了。
如何创建此 validate
方法以允许用户仅添加属于同一主类别的子类别,否则 return 会出错?
提前谢谢你。在这方面的帮助将不胜感激。
据我了解,分配给一个项目的所有类别必须是同一类别的子类别。我假设它们必须是子类别。
在 Item 中写一个 custom validation method 验证所有子类别都有父类别,并且所有子类别都相同。
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
我正在使用 ancestry 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')
此外,我还使用 cocoon gem 来创建多个子类别并将其关联到一个项目。
现在我想在模型中添加一个自定义validate
方法,这将允许用户只添加属于同一主类别的子类别,否则return一个错误:
errors.add(:category, "you can only choose subcategories from he same category")
我对如何创建这个 validate
方法有些困惑。也许首先我应该找到正在添加的子类别:
subcategory = Category.find(category)
然后用这个找到子类别所属的类别:
subcategory.root.name
但在那之后我现在知道该怎么做了。
如何创建此 validate
方法以允许用户仅添加属于同一主类别的子类别,否则 return 会出错?
提前谢谢你。在这方面的帮助将不胜感激。
据我了解,分配给一个项目的所有类别必须是同一类别的子类别。我假设它们必须是子类别。
在 Item 中写一个 custom validation method 验证所有子类别都有父类别,并且所有子类别都相同。
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