ActiveResource "NoMethodError (неопределенный метод` path 'для nil: NilClass): "периодическая ошибка - PullRequest
1 голос
/ 28 мая 2019

Я сталкиваюсь с периодической ошибкой, когда вызов ресурса ActiveResource, например:

Cart.where(session_id: get_guid, status: 1)

Выдает ошибку:

NoMethodError (undefined method `path' for nil:NilClass)

Но только с перерывами. Перезапуск сервера Rails временно решает проблему, но через некоторое неопределенное время он снова выходит из строя.

1 Ответ

2 голосов
/ 28 мая 2019

Причиной проблемы была функция автозагрузки 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
...