我有Hanami 1.3.3和两个验证器:用于创建和更新这样的操作
module Validators
module MyEntities
class Create
include Hanami::Validations::Form
include Validatable
messages :i18n
validations do
required(:first_attr).filled(:bool?)
required(:second_attr).filled(:int?)
required(:attr_for_create).filled(:str?)
end
end
end
endmodule Validators
module MyEntities
class Update
include Hanami::Validations::Form
include Validatable
messages :i18n
validations do
required(:first_attr).filled(:bool?)
required(:second_attr).filled(:int?)
required(:attr_for_update).filled(:str?)
end
end
end
end事实上,验证规则的数量超过了20个。
正如您所看到的,这里有很多重复的代码。
我想烘干它,并使用一些继承
我找不到这方面的收据。只是讨论 in GitHub问题。那次讨论的结果:这很棘手
如何在Hanami中使用继承的验证器?
发布于 2022-06-09 22:57:43
要回答这个问题,我们需要查看库的源代码。
如你所见在Hanami验证表中有一个validations方法
此方法构建用于验证的架构。除其他外,还使用传递给此方法的块。它是我们在应用程序内部的验证器中写入的带有这些验证规则的块。
要使用继承,我们可以在父类中重写validations方法,并在其中连接两个块:基本父规则和子规则。
要做到这一点,我们需要instance_eval方法
module Validators
module MyEntities
class Base
include Hanami::Validations::Form
include Validatable
messages :i18n
class << self
def validations(&rules)
schema_predicates = __predicates
base = _build(predicates: schema_predicates, &_base_rules)
schema = _build(predicates: schema_predicates, rules: base.rules, &my_entity_rules(&rules)) # overwrite just here
schema.configure(&_schema_config)
schema.configure(&_schema_predicates)
schema.extend(__messages) unless _predicates.empty?
self.schema = schema.new
end
private
def my_entity_rules(&rules)
Proc.new do
instance_eval(&rules) # use child rules
required(:first_attr).filled(:bool?)
required(:second_attr).filled(:int?)
end
end
end
end
end
endmodule Validators
module MyEntities
class Create < Base
validations do
required(:attr_for_create).filled(:str?)
end
end
end
endmodule Validators
module MyEntities
class Update < Base
validations do
required(:attr_for_update).filled(:str?)
end
end
end
endhttps://stackoverflow.com/questions/72567470
复制相似问题