Rails应用程序中/ app /下自定义目录的命名约定?

时间:2016-05-16 01:24:30

标签: ruby-on-rails ruby-on-rails-4

我对命名约定和自动加载有疑问。

我希望在app/presenters/items/item_presenter.rb

中有一位演示者ItemPresenter

我的理解是我可以像这样创建该文件:

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:想出来。我搞砸了文件名(见我发布的答案)

3 个答案:

答案 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中具有单数项。

修正了这一切,一切都开始了。

感谢帮助人员!