我正在使用presenter模式,我似乎遇到了不一致的类命名冲突。我有一个带有主页方法的页面控制器,我想让该方法使用Pages :: HomepagePresenter类,但最终会出现错误:
uninitialized constant ActionController::Caching::Pages::HomepagePresenter
# ./app/controllers/pages_controller.rb:3:in `homepage'
# ./spec/requests/pages_spec.rb:14:in `block (5 levels) in <top (required)>'
假设问题在于演示者的Pages控制器和Pages命名空间,但在演示者使用主页控制器和主页命名空间时似乎没有问题。
我错过了什么吗?以下是我尝试过的应用程序行为的组合:
# Ideal, but this breaks with the aforementioned error
presenters/pages/homepage_presenter.rb (class Pages::HomepagePresenter)
controllers/pages_controller.rb (class PagesController)
# Works
presenters/page/homepage_presenter.rb (class Page::HomepagePresenter)
controllers/pages_controller.rb (class PagesController)
# Workes; I would expect this to break
presenters/homepage/index_presenter.rb (class Homepage::IndexPresenter)
controllers/homepage_controller.rb (class HomepageController)
答案 0 :(得分:4)
我刚刚发布了一个similar question,然后想出了解决方案:
Pages模块已在ActionController :: Caching中定义。当你使用常量“Pages”时,rails会猜到你指的是这个命名空间,但是没有找到HomepagePresenter,所以它会抛出一个错误。
通过在::
前面添加前缀来明确指定顶级命名空间来修复它,如下所示:
@presenter = ::Pages::HomepagePresenter.new(current_user)