控制器名称和演示者名称空间之间的名称冲突

时间:2011-07-30 17:31:10

标签: ruby-on-rails controller presenter

我正在使用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)

1 个答案:

答案 0 :(得分:4)

我刚刚发布了一个similar question,然后想出了解决方案:

Pages模块已在ActionController :: Caching中定义。当你使用常量“Pages”时,rails会猜到你指的是这个命名空间,但是没有找到HomepagePresenter,所以它会抛出一个错误。

通过在::前面添加前缀来明确指定顶级命名空间来修复它,如下所示:

@presenter = ::Pages::HomepagePresenter.new(current_user)