首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承的Hanami验证器

继承的Hanami验证器
EN

Stack Overflow用户
提问于 2022-06-09 22:57:43
回答 1查看 44关注 0票数 1

我有Hanami 1.3.3和两个验证器:用于创建和更新这样的操作

代码语言:javascript
复制
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
end
代码语言:javascript
复制
module 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中使用继承的验证器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-09 22:57:43

要回答这个问题,我们需要查看库的源代码。

如你所见在Hanami验证表中有一个validations方法

此方法构建用于验证的架构。除其他外,还使用传递给此方法的块。它是我们在应用程序内部的验证器中写入的带有这些验证规则的块。

要使用继承,我们可以在父类中重写validations方法,并在其中连接两个块:基本父规则和子规则。

要做到这一点,我们需要instance_eval方法

代码语言:javascript
复制
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
end
代码语言:javascript
复制
module Validators
  module MyEntities
    class Create < Base
      validations do
        required(:attr_for_create).filled(:str?)
      end
    end
  end
end
代码语言:javascript
复制
module Validators
  module MyEntities
    class Update < Base
      validations do
        required(:attr_for_update).filled(:str?)
      end
    end
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72567470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档