Как я могу поместить приложение subdir classess в пространство имен - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу указать пространство имен всех моих классов, помещенных в папку 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 голосов
/ 12 декабря 2018

Что такое 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 делает с models, controllers и т. д.), а затем добавьте описание (в единственном числе) в конец вашего определения (rails делает это с controllers, helpers и mailers, но не с models).

0 голосов
/ 12 декабря 2018

Обычно, когда вы используете namespace, вам нужно иметь структуру вашего файла, как показано ниже:

module Cms
  module Types
    class Post
    end
  end
end

EDIT: Также, чтобы сделать это, автоматически загрузив путь, вы можете добавить следующую строку вapplication.rb:

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