Я сталкиваюсь с прерывистой ошибкой, когда вызывается ресурс ActiveResource, например:
Cart.where(session_id: get_guid, status: 1)
Выдает ошибку:
NoMethodError (undefined method `path' for nil:NilClass)
Но только с перерывами. Перезапуск сервера Rails временно решает проблему, но через некоторое неопределенное время он снова ломается.
Источником проблемы была функция автозагрузки Rails. Несколько осознаний привели меня к этому решению.
У нас было много ресурсов ActiveResource, поэтому, чтобы легко инициализировать ресурсы, мы поместили настройку в инициализатор (который запускается только во время запуска сервера Rails):
# config/initializers/active_resource_setup.rb
Cart.site = ENV["ROOT_URL"]
Я также понял, что это не проблема в производственной среде. Раньше это было не так ясно, потому что эта проблема возникла во время значительного обновления Rails, поэтому я решил, что сломал ее с самого начала.
Однако источник проблемы заключался в том, что Rails автоматически перезагружала файлы определения класса ресурсов всякий раз, когда в исходный код вносились изменения. Это перезагрузит определение класса:
# app/models/resources/cart.rb
class Cart < ActiveResource::Base
validates :session_id, presence: true
end
И поскольку определения Cart.site
не было в этом файле, как предполагалось, ресурс был фактически сброшен, а конфигурация site
была уничтожена процессом автоматической перезагрузки.
Решение состоит в том, чтобы переместить определение Cart.site
в определение ресурса:
# app/models/resources/cart.rb
class Cart < ActiveResource::Base
self.site = ENV["ROOT_URL"]
validates :session_id, presence: true
end
@lacostenycoder Исправлено, спасибо! Должно быть, я упустил это из виду, делая пример кода намного проще, чем реальный код, ха-ха.
да, инициализаторы запускаются только при запуске приложения. Но у вас небольшая опечатка, вы пропустили закрытие
]
в ENV VAR.