dry-struct Как условно проверить один атрибут? - PullRequest
0 голосов
/ 12 ноября 2018

Я использую dry-types и dry-struct, и я хотел бы получить условную проверку.

для класса:

class Tax < Dry::Struct
  attribute :tax_type, Types::String.constrained(min_size: 2, max_size: 3, included_in: %w[IVA IS NS])
  attribute :tax_country_region, Types::String.constrained(max_size: 5)
  attribute :tax_code, Types::String.constrained(max_size: 10)
  attribute :description, Types::String.constrained(max_size: 255)
  attribute :tax_percentage, Types::Integer
  attribute :tax_ammount, Types::Integer.optional
end

Я хочу проверить tax_ammountкак целое число и обязательно , если `tax_type == 'IS'.

1 Ответ

0 голосов
/ 13 ноября 2018

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...