我想创建一个由两个名称空间隔离的引擎。也就是说,比方说,我想制作一个所有类都存在的引擎:
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
答案 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
宝石或其他东西。
我仍然很难弄清楚为什么你想要一个双重命名空间。