В Rails может возникнуть ошибка undefined method `to_datetime' for nil:NilClass при выполнении следующего кода:
Здесь берутся товары и отбираются те из них, что попадают в нужный диапазон дат.
product.start_date - дата начала периода публикации товара
product.end_date - дата конца периода публикации товара
В начале мы проверяем, что у товара есть эти параметры, а уже после этого сравниваем их с датами first_start_date и start_date_ago, которые определены где-то выше по коду. Это позволяет нам избежать ошибки:
NoMethodError: undefined method `<' for nil:NilClass.
Почему же в приведенном выше коде возникает ошибка undefined method `to_datetime' for nil:NilClass ?
Это связано с тем, что мы по невнимательности нарушили расстановку скобок. Сначала нам нужно убедиться в наличии параметров product.start_date и product.end_date, а уже потом выполнять остальные сравнения:
filtered_products = products.select do |product| product.start_date && product.end_date && (product.start_date <= start_date_ago && start_date_ago <= product.end_date) || (start_date_ago <= product.start_date && product.start_date < first_start_date) end
Здесь берутся товары и отбираются те из них, что попадают в нужный диапазон дат.
product.start_date - дата начала периода публикации товара
product.end_date - дата конца периода публикации товара
В начале мы проверяем, что у товара есть эти параметры, а уже после этого сравниваем их с датами first_start_date и start_date_ago, которые определены где-то выше по коду. Это позволяет нам избежать ошибки:
NoMethodError: undefined method `<' for nil:NilClass.
Почему же в приведенном выше коде возникает ошибка undefined method `to_datetime' for nil:NilClass ?
Это связано с тем, что мы по невнимательности нарушили расстановку скобок. Сначала нам нужно убедиться в наличии параметров product.start_date и product.end_date, а уже потом выполнять остальные сравнения:
filtered_products = products.select do |product| product.start_date && product.end_date && ((product.start_date <= start_date_ago && start_date_ago <= product.end_date) || (start_date_ago <= product.start_date && product.start_date < first_start_date)) end
Комментариев нет:
Отправить комментарий