dry-struct
действительно для базового утверждения типа и принуждения.
Если вам нужна более сложная проверка, возможно, вы также захотите внедрить dry-validation
(в соответствии с рекомендациями dry-rb
)
См. Проверка данных с помощьюdry-struct которая гласит
Пожалуйста, не надо.Структуры предназначены для работы с допустимым вводом, он не может генерировать сообщения об ошибках, достаточно хорошие для отображения их для пользователя и т. Д. Используйте сухую проверку для проверки входящих данных и затем передайте их выходные данные в структуры.
условная проверка с использованием dry-validation
будет выглядеть примерно так:
TaxValidation = Dry::Validation.Schema do
# Could be:
# required(:tax_type).filled(:str?,
# size?: 2..3,
# included_in?: %w(IVA IS NS))
# but since we are validating against a list of Strings I figured the rest was implied
required(:tax_type).filled(included_in?: %w(IVA IS NS))
optional(:tax_amount).maybe(:int?)
# rule name is of your choosing and will be used
# as the errors key (i just chose `tax_amount` for consistency)
rule(tax_amount:[:tax_type, :tax_amount]) do |tax_type, tax_amount|
tax_type.eql?('IS').then(tax_amount.filled?)
end
end
- Для этого требуется
tax_type
, чтобы быть в списке %w(IVA IS NS)
; - Позволяет
tax_amount
быть необязательным, но если оно заполнено, оно должно быть Integer
(int?
) и; - Если
tax_type == 'IS'
(eql?('IS')
), тогда необходимо заполнить tax_amount
(что означает, что это должно быть Integer
на основании правила выше).
Очевидно,Вы можете проверить и другие ваши входные данные, но я оставил их для краткости.
Примеры:
TaxValidation.({}).success?
#=> false
TaxValidation.({}).errors
# => {:tax_type=>["is missing"]}
TaxValidation.({tax_type: 'NO'}).errors
#=> {:tax_type=>["must be one of: IVA, IS, NS"]}
TaxValidation.({tax_type: 'NS'}).errors
#=> {}
TaxValidation.({tax_type: 'IS'}).errors
#=> {:tax_amount=>["must be filled"]}
TaxValidation.({tax_type: 'IS',tax_amount:'NO'}).errors
#=> {:tax_amount=>["must be an integer"]}
TaxValidation.({tax_type: 'NS',tax_amount:12}).errors
#=> {}
TaxValidation.({tax_type: 'NS',tax_amount:12}).success?
#=> true