Проблема в том, что вы пытаетесь позвонить is_admin?
на Symbol
:user
, как предполагает ошибка.
Если я правильно понимаю, этот атрибут должен присутствовать unless
user.is_admin?
возвращает true
Это можно сделать несколькими способами:
validates :attribute_name, presence: true, unless: -> {|u| u.is_admin?}
#Or
validates :attribute_name, presence: true, unless: :is_admin?
# or using presence directly as you tried to originally
validates :attribute_name, presence: {unless: -> {|u| u.is_admin?} }
# or
validates :attribute_name, presence: {unless: :is_admin? }
Я обычно предпочитаю первый вариант, поскольку, IMO, он наименее двусмысленный и наиболее читаемый, но все они должны приводить к одной и той же функции, поэтому выбирайте тот, который вы предпочитаете, пока вы остаетесь последовательным.
В блочной форме экземпляр передается блоку, а возвращаемое значение блока используется для определения того, должна ли выполняться проверка.
При использовании символа символ отправляется экземпляру посредством передачи сообщения send
, например, self.send(:is_admin?
и снова возвращаемое значение используется для определения необходимости применения проверки
ActiveModel :: Validations :: # проверяет методы класса
Обновление на основе пересмотренного вопроса:
Так как Event
относится к User
через submitter
, и это уже устанавливается для экземпляра User
, вы можете проверить очень похожим способом через
validates :attribute_name, presence: true,
unless: ->(event) { event.submitter&.is_admin?}
Или создайте отдельный метод, например
def admin_submitter?
self.submitter&.is_admin?
end
validates :attribute_name, presence: {unless: :admin_submitter?}