Предотвращение «предупреждение: верхний уровень константы B, на который ссылается A :: B» с пространствами имен в Rails - PullRequest
15 голосов
/ 21 марта 2012

При хранении файлов в пользовательском каталоге (например, app/presenters/), как обеспечить загрузку классов пространства имен?

Например, если у вас есть:

Rails не загружается MegaMenu::CatalogPresenter:

CatalogPresenter.new
=> #<CatalogPresenter:0x85bca68 @_routes=nil>

MegaMenu::CatalogPresenter.new
(irb):3: warning: toplevel constant CatalogPresenter referenced by MegaMenu::CatalogPresenter
=> #<CatalogPresenter:0x85750a0 @_routes=nil>

Я создал пример приложения Rails 3.2, которое воспроизводит эту проблему .

В config/application.rb приложение настроено на загрузку файлов в app/presenters/.

Ответы [ 2 ]

17 голосов
/ 21 ноября 2012

Я решил эту проблему с помощью оператора require в инициализаторе.Мне это не очень нравится, но мне понравились структура и имена классов моего приложения, они имели смысл, поэтому инициализатор был моим лучшим решением.В инициализаторе попробуйте:

require File.join(Rails.root, "app", "presenters", "mega_menu", "catalog_presenter")
require File.join(Rails.root, "app", "presenters", "catalog_presenter")

Эта проблема возникает из-за того, что автозагрузка выполняется при вызове const_missing, что не произойдет в вашем случае.

Когда ruby ​​впервые обнаруживает ссылку на MegaMenu :: CatalogPresenter, файл mega_menu / catalog_presenter.rb не был включен.Стандартное поведение ruby ​​заставляет его пройтись по дереву пространства имен (фигуре речи), и вместо этого он находит ссылку на каталог верхнего уровня CatalogPresenter, так как это было включено в этот момент.

0 голосов
/ 21 марта 2012

Создание новых констант верхнего уровня внутри классов вызывает эту ошибку. Вы хотите что-то похожее на catalog_presenter.rb:

class MegaMenu
  class MegaMenu::CatalogPresenter
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...