Проверка типа данных в рельсах ActiveModel :: Validations - PullRequest
0 голосов
/ 16 октября 2019

Я хотел проверить атрибуты класса по отношению к их типу данных.

Я пишу API в ruby, и мне нужно проверить, имеют ли данные определенного типа тип String, hash, Array и т. Д.

напр. у нас есть

class ApiValidation
  include ActiveModel::Validations
  attr_accessor :fieldName

  validates :fieldName, :presence => true 
end 

, очень похожий на :presence => true, я хочу добавить еще одну проверку, например :datatype => :string

Пожалуйста, предложите мне некоторую пользовательскую проверку или любой другой подход для достижения моих требований.

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Вы можете проверить стек dry-rb.

Есть https://github.com/dry-rb/dry-types (https://dry -rb.org / gems / dry-types / 1.2 / )камень, который делает именно то, что вы хотите.

Из документов:

Strict types will raise an error if passed an attribute of the wrong type:

class User < Dry::Struct
  attribute :name, Types::Strict::String
  attribute :age,  Types::Strict::Integer
end
User.new(name: 'Bob', age: '18')
# => Dry::Struct::Error: [User.new] "18" (String) has invalid type for :age
0 голосов
/ 17 октября 2019

Параметры всегда принимаются в виде текста. В Ruby нет статических типов, но есть классы, поэтому вашему коду необходимо проанализировать каждый атрибут и преобразовать их в ожидаемый класс.

Это может быть так же просто, как использовать встроенные в Ruby методы преобразования, например. to_i, to_sym, to_d, to_h, или вам может понадобиться добавить больше логики, например. JSON.parse.

Обратите внимание на разницу между строгим и нестрогим синтаксическим анализом, который потребует различной обработки потока управления.

>> "1one".to_i
=> 1

>> Integer("1one")
ArgumentError: invalid value for Integer(): "1one"
0 голосов
/ 16 октября 2019

В Ruby "типы данных" на самом деле просто классы. Итак, все, что вам действительно нужно сделать, это проверить, к какому классу fieldName принадлежит (fieldName.class) в вашей пользовательской проверке .

...