2016-05-16 48 views
0

我有关于命名约定和自动加载的问题。Rails应用程序中/ app /下的自定义目录命名约定?

我想有一个主持人ItemPresenter在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不重复的,因为它是关于DIF ferent目录结构jobs/smth.rb,而我想实现presenters/items/item_presenter.rb(1倍以上的水平)

EDIT2:无论从铁轨控制台的工作原理: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没有看到di所有的教区。

EDIT3:创建一个示例应用程序https://github.com/dontlookforme/test_app

EDIT4:想通了。我搞砸了文件名(请参阅我发布的答案)

+0

你可以发布你得到的确切的错误消息吗?我在一个虚拟应用程序中创建了这个功能,并且可以在我的导航控制台中调用'Items :: ItemPresenter' – sixty4bit

+0

您是否需要一个模块演示者包含模块项目和类ItemPresenter? –

+0

@ sixty4bit ugh。即使在我的rails控制台中也不起作用:(更新了问题 – Anton

回答

1

我找到了答案,但有必要看到@ user1556912的示例应用程序(在原来的问题链接),看看发生了什么。

问题是文件名是items_presenter.rb(复数),但类名是ItemPresenter(单数)。

正如我在@Anthony E的回答中所指出的那样,Rails会自动加载/app目录中的所有内容,所以不需要明确告诉Rails这些文件。但是,除了命名空间匹配目录层次结构外,类的名称还必须完全匹配文件的名称。在这种情况下,我可以通过将items_presenter.rb重命名为item_presenter.rb来让课程在导轨控制台中加载。

回到@Anthony E的回答,虽然,我确实认为Items::命名空间在这里似乎是多余的。我只想做app/presenters/item_presenter.rb

0

app/presenters/是存储演示者的常规路径。事实上,你也许可以去无文件夹嵌套的项目:

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' 
+0

不应该有必要明确自动加载路径在'/ app'中,Rails已经加载了该目录中的所有内容(一个是nefit的新文件,而不是'/ lib') – sixty4bit

0

呃。我做错了的事是文件名。 我给预选文件items_presenter.rb命名,但是这个班有ItemPresenter这个名字。

修复并开始工作。

感谢您的帮助!

+0

我已经发布了这个答案2分钟,然后你^ _ ^见下面... – sixty4bit

+1

@ sixty4bit ahha that timing:D你已经发布,而我正在打字。非常感谢你! – Anton