我对命名约定和自动加载有疑问。
我希望在app/presenters/items/item_presenter.rb
我的理解是我可以像这样创建该文件:
module Items
class ItemPresenter
end
end
但是当我这样做并尝试将演示者称为Items::ItemPresenter
时,我收到uninitialized constant
错误:
uninitialized constant Items::ItemPresenter
def show
@presenter = Items::ItemPresenter.new # this is the highlighted line of my Controller
编辑:Rails, Custom Folders and Namespaces不重复,因为它涉及不同的目录结构jobs/smth.rb
,而我正在尝试实施presenters/items/item_presenter.rb
(另外1个级别)
EDIT2:它都不适用于rails控制台:NameError: uninitialized constant Items::ItemPresenter
EDIT2:我尝试按照建议这样做:
module Presenters
module Items
class ItemPresenter
def test
"hello"
end
end
end
end
我的控制器中有@presenter = Presenters::Items::ItemPresenter.new
:
uninitialized constant TrialsController::Presenters
似乎Rails根本看不到该目录。
EDIT3:创建了一个示例应用https://github.com/dontlookforme/test_app
EDIT4:想出来。我搞砸了文件名(见我发布的答案)
答案 0 :(得分:1)
我找到了答案,但有必要查看@ user1556912的示例应用程序(原始问题中的链接),看看发生了什么。
问题是文件名为items_presenter.rb
(复数),但类名为ItemPresenter
(单数)。
正如我在@Anthony E的答案评论中指出的那样,Rails会自动加载/app
目录中的所有内容,因此没有必要明确告诉Rails这些文件。但是,除了匹配dir层次结构的名称空间外,类的名称还必须与文件名完全匹配。在这种情况下,我可以通过将items_presenter.rb
重命名为item_presenter.rb
来使类加载到rails控制台中。
回到@Anthony E的回答,我确实同意Items::
命名空间在这里似乎是多余的。我会做app/presenters/item_presenter.rb
。
答案 1 :(得分:0)
app/presenters/
是存储演示者的常规路径。实际上,您可以在没有文件夹嵌套的情况下使用项目:
应用程序/主持人/ item_presenter.rb
您需要相应地更新模块路径:
module Presenters
class ItemPresenter
def test
"hello"
end
end
end
然后,您可以告诉Rails在application.rb
:
config.autoload_paths << '#{config.root}/app/presenters'
答案 2 :(得分:0)
唉。我做错的是文件名。
我将preseter文件命名为items_presenter.rb
,但该类在名称ItemPresenter
中具有单数项。
修正了这一切,一切都开始了。
感谢帮助人员!