我有 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
end
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
實際上,驗證規則的數量是二十多個
如您所見,這里有很多重復的代碼
我想干燥它并使用一些繼承
我找不到一些收據。僅在 GitHub 問題中討論。討論的結果:非常棘手
如何在 Hanami 中使用繼承的驗證器?
uj5u.com熱心網友回復:
要回答這個問題,我們需要看一下庫的源代碼
如您所見validations,Hanami 驗證 gem 中有一種方法
此方法構建用于驗證的模式。除其他外,使用傳遞給此方法的塊。它是我們在應用程式內部的驗證器中撰寫的具有這些驗證規則的塊
要使用繼承,我們可以覆寫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
end
module Validators
module MyEntities
class Create < Base
validations do
required(:attr_for_create).filled(:str?)
end
end
end
end
module Validators
module MyEntities
class Update < Base
validations do
required(:attr_for_update).filled(:str?)
end
end
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490314.html
上一篇:導軌如何將資料輸入新陣列
