Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有嵌套命名空间的Rails 4引擎_Ruby On Rails_Ruby On Rails 4_Namespaces_Rails Engines_Rails Generate - Fatal编程技术网

Ruby on rails 具有嵌套命名空间的Rails 4引擎

Ruby on rails 具有嵌套命名空间的Rails 4引擎,ruby-on-rails,ruby-on-rails-4,namespaces,rails-engines,rails-generate,Ruby On Rails,Ruby On Rails 4,Namespaces,Rails Engines,Rails Generate,我找不到在rails下生成具有嵌套名称空间的引擎的方法。每次我这样做,我基本上都必须手工编辑和移动生成的文件。 rails中真的不支持嵌套名称空间吗?似乎不太可能 在该公司,我们将所有内容命名为: CompanyName::SerivceName::模块 因此,当我在处理Service1并制作引擎时,它将集成到客户支持用于根据客户请求与该服务的用户和数据进行交互的应用程序中,我希望在下面创建该引擎 公司名称::服务1::客户支持 然而,rails似乎无法做到这一点 不接受使用rails插件新建

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

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

因此,当我在处理Service1并制作引擎时,它将集成到客户支持用于根据客户请求与该服务的用户和数据进行交互的应用程序中,我希望在下面创建该引擎 公司名称::服务1::客户支持

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

  • 不接受使用
    rails插件新建a::b::blah

    akovanm0:testavandra$rails插件新的a::b::blah-T--dummy path=spec/dummy--mountable--full--mountable

    插件名a::b::blah无效。请提供一个仅使用字母、数字或“u”字符的名称。

  • 指定
    rails plugin new a/b/blah
    将生成一个引擎,但其输出与
    rails plugin new blah

  • 指定
    rails plugin new a_b_blah
    将生成一个具有文字名称a_b_blah(而不是名称空间)的引擎。(实际名称为camelcased to ABBlah)
我想要实现的是一个引擎,它的控制器、模型和视图都是在
a::b::blah
名称空间下生成的,并且可以以相同的方式装载。 我希望所有生成的控制器都置于
app/controllers/a/b/blah
下,模型置于
app/models/a/b/blah
下,依此类推


有没有办法做到这一点?

您需要创建启用可安装选项的引擎,如下所示,
rails插件新引擎名称--mountable

它将在lib/engine\u name/engine.rb中添加
isolate\u namespace EngineName
方法调用以隔离引擎名称空间。

您需要创建启用可装载选项的引擎,如下所示,
rails插件新引擎名称--mountable

它将在lib/engine\u name/engine.rb中添加
isolate\u namespace EngineName
方法调用以隔离引擎名称空间。

我认为您不能这样做:(

编辑:看看答案的底部,我修改了rails插件生成器就是为了这么做:)

如果仔细查看源代码(),您会发现插件名称只是目标文件夹的基本名称

  def original_name
    @original_name ||= File.basename(destination_root)
  end
因此,如果您编写
rails plugin new a/b/c
,则插件将在当前文件夹的a/b/c子文件夹中创建,但名称仅为c:(

如果您重写原始的\u name方法以根据需要返回a/b/c,那么您将需要使用
有效的\u const?
方法()来验证格式名称并接受“仅字母、数字或uu字符。”以及创建模块的模板

  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
我正在考虑使用插件模板()来代替我的命名空间插件:(

编辑:我撒谎说你必须反对什么方法。这不是名称方法,而是模板

编辑(II):我已经修改了plugin_新文件夹,允许嵌套名称空间。您可以在这里看到它:


如果您有任何反馈,我将不胜感激:)

我想您不能这样做:(

编辑:看看答案的底部,我修改了rails插件生成器就是为了这么做:)

如果仔细查看源代码(),您会发现插件名称只是目标文件夹的基本名称

  def original_name
    @original_name ||= File.basename(destination_root)
  end
因此,如果您编写
rails plugin new a/b/c
,则插件将在当前文件夹的a/b/c子文件夹中创建,但名称仅为c:(

如果您重写原始的\u name方法以根据需要返回a/b/c,那么您将需要使用
有效的\u const?
方法()来验证格式名称并接受“仅字母、数字或uu字符。”以及创建模块的模板

  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
我正在考虑使用插件模板()来代替我的命名空间插件:(

编辑:我撒谎说你必须反对什么方法。这不是名称方法,而是模板

编辑(II):我已经修改了plugin_新文件夹,允许嵌套名称空间。您可以在这里看到它:


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

尝试或创建您自己的生成器

尝试或创建您自己的生成器

我知道,但没有创建嵌套名称空间的选项。如果您正在创建模型,那么就这样生成它,
rails g model a/b/blah
同样适用于控制器,
rails g controller a/b/blah
我知道,但没有操作创建一个嵌套的名称空间OK,如果你正在创建一个模型,然后像这样生成它,
rails g model a/b/blah
控制器也是一样,
rails g controller a/b/blah
我想你应该提出一个拉取请求,也许它会被接受到上游,每个人都能从中受益不是这样,但我只是在我的案例中使用它,不知道它是否有任何不想要的副作用。这就是我要求反馈的原因:)但这是一个好主意,我将发送一个拉请求,看看Rails用户是否接受它。谢谢!在下一个Rails小版本中,这个解决方案效果不太好(我认为一些文件更改了位置)而且我从来没有时间通过良好的测试来创建一个合适的PR:(我认为你应该提出一个拉式请求,也许它会被接受到上游,每个人都能从中受益。我在考虑它,但我只在我的案例中使用它,不知道它是否有任何不希望的副作用。这就是为什么我要求反馈:)但这是一个好主意,我将发送一个pull请求,看看Rails的用户是否接受它。谢谢!在下一个小Rails版本中,这个解决方案效果不太好(我认为一些文件改变了它们的位置),我从未收到过请求