如何将应用程序子目录类放在命名空间下

时间:2018-12-12 10:15:09

标签: ruby-on-rails ruby ruby-on-rails-5

我想为我所有放在app/cms模块下Cms文件夹中的类命名空间。因此,假设我有一个以下文件:

# /app/cms/types/post.rb
class Cms::Types::Post
end

Rails假定放置在此目录中的文件的类定义应为Types::Post,而不是Cms::Types::Post。因此,当调用Cms::Types::Post.new时,rails会抛出

LoadError (Unable to autoload constant Types::Post, expected /Users/xxx/workspace/personal/xxx/app/cms/types/post.rb to define it)

如何在Cms下对所有这些文件进行命名空间?

我在5.2.0的轨道上

2 个答案:

答案 0 :(得分:1)

什么是Post?我的意思是Post的本质是什么?例如,这是一项服务吗?

例如,如果它是一项服务,我将其放在:

/app/services/cms/types/post_service.rb

然后将其定义为:

class Cms::Types::PostService
end

如果它是一个type(似乎是一个有问题的名称),那么我将在以下位置进行定义:

/app/types/cms/post_type.rb

并将其定义为:

class Cms::PostType
end

换句话说,使用/app的描述在Post下命名目录(就像rails对modelscontrollers等所做的描述一样),然后将描述(以单数形式)添加到定义的末尾(rails使用controllershelpersmailers进行此操作,而不使用models进行此操作)。 / p>

答案 1 :(得分:0)

通常,当您使用namespace时,您需要具有以下文件结构:

module Cms
  module Types
    class Post
    end
  end
end

EDIT:另外,要自动加载路径,可以在application.rb中添加以下行:

config.autoload_paths << Rails.root.join('app', 'cms').to_s