Rails - 对engine_name的调用似乎被忽略了

时间:2013-04-18 16:11:28

标签: ruby-on-rails rails-engines ruby-on-rails-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_

我做错了什么?我使用的rails的版本是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

2 个答案:

答案 0 :(得分: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

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

有更多配置选项,请参阅例如here。编辑它们以满足您的需求。

答案 1 :(得分:0)

我不明白为什么你会这么想。如果要在Car引擎之间共享功能,继承可能不是这样。如果你真的想要的话,你可能有它的初始风格,汽车引擎内的宝马引擎。

如果Car不是您要为其他子模块添加功能和共享的模块,请将其删除。

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

我仍然很难弄清楚为什么你想要一个双重命名空间。