Rails 6 - проблема с созданием обратного вызова для проверки ввода указанного c текста - PullRequest
0 голосов
/ 20 апреля 2020

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

То, что я сейчас пытаюсь сделать, это проверить, что параметр url, передаваемый в скрытое поле формы, не изменяется и точно соответствует одному из трех вариантов:

owner_operator, broker_shipper или carrier

В настоящее время я пробовал это, однако он по-прежнему позволяет сохранять форму, даже если параметр не совпадает с одним из параметров ...

мой обратный вызов, как сейчас.

accounts.rb

before_validation :validate_account_type

  def validate_account_type
    return if account_type == 'owner_operator' || 'broker_shipper' || 'carrier'
  end

любая помощь здесь будет принята с благодарностью!

1 Ответ

3 голосов
/ 20 апреля 2020

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

account_type == 'owner_operator' || 'broker_shipper' || 'carrier'

Выше выражение оценивается как ниже

(account_type == 'owner_operator') || 'broker_shipper' || 'carrier' 

Даже если account_type == 'owner_operator' равно false, тогда Следующее условие в выражении broker_shipper оценивается как true. Таким образом, ваша запись всегда действительна в соответствии с условием.

В ruby, кроме nil и false все true.

Таким образом, решение

account_type == 'owner_operator' || account_type == 'broker_shipper' || account_type == 'carrier'

еще лучше

ACCOUNT_TYPES = %w(owner_operator broker_shipper carrier)
def validate_account_type
  ACCOUNT_TYPES.include? account_type
end

Узнать о приоритетах операторов поможет вам в долгосрочной перспективе.

...