4

我想制作一个由两个命名空间隔离的引擎。也就是说,例如,我想制作一个引擎,其类都存在于:

Car::BMW

因此,我的模型例如应该放在:

app/models/car/bmw/

我的表格应该以例如为前缀:

car_bmw_

我试图通过使用此代码来完成此操作lib/car/bmw/engine.rb

module Car
  module BMW
    class Engine < ::Rails::Engine
      isolate_namespace Car::BMW # This will call: engine_name 'car_bmw'
    end
  end
end

但是,每当我生成模型时,使用此代码,模型都会放置在:

app/models/car

该表的前缀为:

car_

我究竟做错了什么?我正在使用的导轨版本是4.0.0.beta1


编辑

我在Rails::Generators::NamedBase

def namespaced_path
  @namespaced_path ||= namespace.name.split("::").map {|m| m.underscore }[0]
end

如您所见,它只占用命名空间的第一部分。有人知道为什么吗?

这是 Rails 中的错误还是我不应该让我的类具有双重命名空间?


这是我用来修复发电机的快速破解方法。

require 'rails/generators'

Rails::Generators::NamedBase.class_eval do
  protected
    def namespaced_class_path
      @namespaced_class_path ||= [namespaced_path.split('/')] + @class_path
    end

    def namespaced_path
      @namespaced_path ||= namespace.name.split("::").map {|m| m.underscore }.join('/')
    end

    def class_name
      ([file_name]).map!{ |m| m.camelize }.join('::')
    end
end
4

2 回答 2

0

我不明白你为什么想要那个。如果你想在你的Car引擎之间共享功能,继承可能不是办法。如果你真的想要的话,你可能会拥有它的初始风格,即在汽车引擎中安装 BMW 引擎。

如果Car不是您想要添加功能并在其他子模块之间共享的模块,则将其删除。

如果您希望汽车引擎喜欢Car::BMW共享功能,那么您可以将其作为外部依赖项。您所有的汽车引擎都可能需要ActsAsACar宝石或其他东西。

我仍然很难弄清楚为什么要使用双重命名空间。

于 2013-04-27T13:05:57.363 回答
0

使用这样的类

module Car
  module BMW
    class Engine < ::Rails::Engine
      isolate_namespace Car::BMW # This will call: engine_name 'car_bmw'
      paths["app/models"] << "app/models/car/bmw"
    end
  end
end

将允许您从您指定的子目录加载模型。不过,我不能说这是否会影响生成过程。

还有更多配置选项,请参见此处。编辑它们以满足您的需求。

于 2013-04-25T12:47:48.297 回答