Как использовать ActiveModel's Validations & Callbacks в пользовательском классе? - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь использовать ActiveModel Validations & Callbacks для пользовательского класса.

class TestClass
  include ActiveModel::Validations
  define_model_callbacks :validate

  attr_accessor :test_field
  validates :test_field, presence: true # THIS IS CAUSING ISSUES!

  before_validate do 
    test_field.try('upcase!')
  end

  def custom_validate!
    run_callbacks :validate do
      puts "Done"
    end
  end
end

Но я получаю следующую ошибку:

Failure/Error:
  run_callbacks :validate do
    ...
  end
  NoMethodError: 
     undefined method `before_validate' for #<ActiveModel::Validations::PresenceValidator>

Если я изменяю имя обратного вызова на что-то другое, чем validate (например, validate_x), это работает. Очевидно, validate делает немного больше, чем я ожидал. Эта ошибка возникает, только если определено validates :test_field, presence: true. Для пользовательских блоков before_validate {} это не вызывает ошибок. Есть идеи как это исправить?

1 Ответ

3 голосов
/ 13 марта 2020

Имя обратного вызова before_validation, просто include ActiveModel::Validations::Callbacks модуль тоже, попробуйте это

include ActiveModel::Validations
include ActiveModel::Validations::Callbacks

before_validation do 
  test_field.try('upcase!')
end

Для запуска пользовательской проверки

before_validation :custom_validation

https://api.rubyonrails.org/classes/ActiveModel/Validations/Callbacks/ClassMethods.html#method -i -before_validation

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...