проверка наличия атрибута с условием - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь представить в своем приложении функциональность, в которой пользователи могут предлагать организаторам событие. Чтобы предложить событие, пользователь должен будет заполнить форму.Я хочу проверить наличие нескольких полей (атрибута событий) с условием быть истинным, то есть поля не следует оставлять пустыми, если пользователь (отправитель формы) не является администратором. Однако если отправительформы - администратор, поля можно оставить пустыми.

validates :attribute_name, presence: { :if => :user.is_admin? }

неопределенный метод `is_admin? 'для: пользователь: символ Вы имели в виду?is_haml?

Я также пытался :user.is_admin()==True, также выдает ошибку: неопределенный метод is_admin для: user: Symbol Вы имели в виду?is_a?

У меня есть этот атрибут в таблице пользователей:

t.boolean  "is_admin",               default: false

В моей модели событий определены следующие ассоциации:

has_many :event_users, dependent: :destroy
  has_many :users, through: :event_users


  has_one :submitter_event_user, -> { where(event_role: 'submitter') }, class_name: 'EventUser'
  has_one  :submitter, through: :submitter_event_user, source: :user

В контроллерах Iиметь этот код:

@event.submitter = current_user

1 Ответ

4 голосов
/ 10 июня 2019

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