NoMethodError: неопределенный метод `<'для nil: NilClass - PullRequest
0 голосов
/ 20 марта 2019

Я добавляю пользовательскую проверку в свое приложение при создании купона, дата начала срока действия купона должна быть раньше даты окончания.

validate :to_must_be_after_from

private
    def to_must_be_after_from
      if valid_to < valid_from
        self.errors[:base] << "Coupon cannot expire before the start of its validity period."
      end
    end

valid_to и valid_from - поля даты.


Когда я запускаю это, возникает ошибка NoMethodError.У меня следующий вопрос по этому поводу:

  1. '<' - это оператор, а не функция, тогда как такая ошибка может возникать. </li>
  2. Как это исправить и сделать функцию кодаправильно.

Ответы [ 4 ]

3 голосов
/ 20 марта 2019

Большинство операторов на самом деле являются методами в Ruby.Этот код:

valid_to < valid_from

является просто синтаксическим сахаром для

valid_to.<(valid_from)

Сообщение об ошибке в значительной степени говорит само за себя, вы должны убедиться, что valid_to и valid_from не nil, используя, например, выражение охраны, например, так:

def to_must_be_after_from
  return if valid_to.blank? || valid_from.blank?

  # rest of the code
end
1 голос
/ 20 марта 2019

Сначала необходимо проверить, является ли поле «от» или «нет» пустым или нет. тогда вы можете проверить значение меньше или больше.

def to_must_be_after_from

  return if valid_from.blank? || valid_to.blank?

  if valid_from < Date.today
    errors.add(:base, "You can't select past dates in valid from")
  elsif valid_to < valid_from
    errors.add(:base, "valid to can't be before the valid from date")
  end
end
0 голосов
/ 20 марта 2019

На основании сообщения об ошибке -

Вы пытаетесь сравнить переменные, в которых one variable is nil.Можете ли вы проверить, имеют ли valid_to и valid_from правильные значения, перед проверкой валидации - if valid_to < valid_from?

0 голосов
/ 20 марта 2019

Ваша ошибка говорит о том, что valid_to - ноль, поэтому вы не можете использовать оператор < для нулевого класса.

def to_must_be_after_from
  return if valid_from.blank? || valid_to.blank?

  if valid_to.to_date < valid_from.to_date
    errors.add(:base, "valid to can't be before the valid from date")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...