Движок Rails 4 с вложенным пространством имен

Я не смог найти способ генерировать движки с вложенными пространствами имен под рельсы. Каждый раз, когда я это делаю, мне в основном приходится редактировать и перемещать сгенерированные файлы вручную. Действительно ли в рельсах нет поддержки вложенных пространств имен? Кажется маловероятным.

В компании мы именуем все так: CompanyName::SerivceName::Module

Поэтому, когда я работаю над Service1 и создаю движок, который будет интегрирован в приложение, которое служба поддержки использует для работы с пользователями и данными этой службы по запросам клиентов, я хотел бы создать этот движок под CompanyName: :Serve1::CustomerSupport

Однако рельсы, похоже, не могут этого сделать.

  • Использование rails plugin new a::b::blah не допускается:

    akovanm0:test avandra$ rails plugin new a::b::blah -T --dummy-path=spec/dummy --mountable --full --mountable

    Invalid plugin name a::b::blah. Please give a name which use only alphabetic or numeric or "_" characters.

  • Указание rails plugin new a/b/blah создает механизм, но имеет тот же результат, что и rails plugin new blah.

  • Указание rails plugin new a_b_blah создает движок с литеральным именем a_b_blah, без пространства имен. (и настоящее имя в верблюжьей оболочке от ABBlah)

Чего я хотел бы добиться, так это движка, контроллеры, модели и представления которого генерируются в пространстве имен a::b::blah, и он монтируется таким же образом. Я хочу, чтобы все сгенерированные контроллеры находились под app/controllers/a/b/blah, модели — под app/models/a/b/blah и так далее...

Есть ли способ добиться этого?


person Ákos Vandra    schedule 19.02.2014    source источник


Ответы (3)


Вам нужно создать движок с включенной опцией монтирования, например, rails plugin new engine_name --mountable. Он добавит вызов метода isolate_namespace EngineName в lib/engine_name/engine.rb, чтобы изолировать пространство имен движка.

person Yogesh Khater    schedule 25.02.2014
comment
Я знаю это, но нет возможности создать пространство имен NESTED. - person Ákos Vandra; 25.02.2014
comment
Хорошо, тогда для этого, если вы создаете модель, сгенерируйте ее следующим образом: rails g model a/b/blah То же самое для контроллера, rails g controller a/b/blah - person Yogesh Khater; 26.02.2014

Я думаю, что вы не можете сделать это :(

РЕДАКТИРОВАТЬ: Посмотрите внизу ответа, я модифицировал генератор плагинов rails, чтобы сделать это :)

Если вы внимательно посмотрите на источник (https://github.com/rails/rails/blob/5f07366bed77116dbfbb5b98d1cdf6c61b3dfc9b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb#L299), вы увидите, что имя плагина просто базовое имя папки назначения.

  def original_name
    @original_name ||= File.basename(destination_root)
  end

Поэтому, если вы напишете rails plugin new a/b/c, тогда плагин будет создан в подпапке a/b/c в вашей текущей папке, но имя будет просто c :(

Если вы переопределите этот метод original_name для возврата a/b/c по желанию, вам придется бороться с обоими методами valid_const? (https://github.com/rails/rails/blob/5f07366bed77116dbfbb5b98d1cdf6c61b3dfc9b/railties/lib/rails/generators/rails/plugin/plugin_generator.rb#L307), который проверяет имя формата и принимает "только буквы, цифры или символы _". и шаблоны, которые создают модули.

  def valid_const?
    if original_name =~ /[^0-9a-zA-Z_]+/
      raise Error, "Invalid plugin name #{original_name}. Please give a name which use only alphabetic or numeric or \"_\" characters."
    elsif camelized =~ /^\d/
      raise Error, "Invalid plugin name #{original_name}. Please give a name which does not start with numbers."
    elsif RESERVED_NAMES.include?(name)
      raise Error, "Invalid plugin name #{original_name}. Please give a name which does not match one of the reserved rails words."
    elsif Object.const_defined?(camelized)
      raise Error, "Invalid plugin name #{original_name}, constant #{camelized} is already in use. Please choose another plugin name."
    end
  end

Я думаю об использовании шаблона плагина (http://edgeguides.rubyonrails.org/rails_application_templates.html) вместо моих плагинов с пространством имен :(

РЕДАКТИРОВАТЬ: Я солгал о том, какими методами вам придется бороться. Это не метод имени, это шаблоны

РЕДАКТИРОВАТЬ (II): я изменил папку plugin_new, поэтому разрешены вложенные пространства имен. У вас есть это здесь: https://github.com/brenes/nested-plugin-generator

Буду признателен за любой отзыв :)

person Brenes    schedule 27.05.2014
comment
Я думаю, вы должны сделать это запросом на вытягивание, возможно, он будет принят в апстрим, и каждый сможет извлечь выгоду. - person Ákos Vandra; 27.05.2014
comment
Я думал об этом, но я использовал его только для своего случая и не знаю, есть ли у него какой-либо нежелательный побочный эффект. Вот почему я просил отзыв :) Но это хорошая идея, я отправлю запрос на включение и посмотрю, примут ли его разработчики Rails. Спасибо! - person Brenes; 27.05.2014
comment
В следующей минорной версии Rails это решение не сработало (думаю, некоторые файлы изменили свое местоположение), и у меня не было времени создать правильный PR с хорошими тестами :( - person Brenes; 30.12.2014

Попробуйте https://github.com/T-Dnzt/Modular-Engine или создайте свой собственный генератор

person Serhiy Nazarov    schedule 20.07.2015