1

我找不到在 Rails 下生成具有嵌套命名空间的引擎的方法。每次我这样做时,我基本上都必须手动编辑和移动生成的文件。Rails 中真的不支持嵌套命名空间吗?似乎不太可能。

在公司,我们将所有内容命名为:CompanyName::SerivceName::Module

因此,当我在 Service1 上工作并制作将集成到客户支持使用的应用程序中的引擎时,该引擎将根据客户请求处理该服务的用户和数据,我想在 CompanyName 下创建该引擎: :Serve1::客户支持

然而,rails 似乎无法做到这一点。

  • 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,等等......

有没有办法做到这一点?

4

4 回答 4

2

我认为你不能这样做:(

编辑:看看答案的底部,我已经修改了 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

我将不胜感激任何反馈:)

于 2014-05-27T08:24:01.303 回答
2

您需要像这样创建启用可安装选项的引擎, rails plugin new engine_name --mountable. 它将isolate_namespace EngineName在 lib/engine_name/engine.rb 中添加方法调用以隔离引擎名称空间。

于 2014-02-25T13:05:06.703 回答
1

尝试https://github.com/T-Dnzt/Modular-Engine或创建自己的生成器

于 2015-07-20T07:44:48.253 回答
0

对于 2022 年阅读本文的任何人,我相信更高版本的 Rails 将带有破折号的引擎名称作为单独的命名空间处理。

rails plugin new parent_engine-sub_engine --mountable

将创建以下内容engine.rb

module ParentEngine
  module SubEngine
    class Engine < ::Rails::Engine
      isolate_namespace ParentEngine::SubEngine
    end
  end
end
于 2022-03-01T17:02:16.100 回答