我正在为一个RESTful API创建一个gem,并且我注意到,由于它是一个REST api,很多资源url都是一样的,因此每个类的几个方法会完全相同(只是uri路径不同)。如何动态创建也在命名空间中的子类?
我开始喜欢这个创建类:
module NameSpace
Class1 < SuperClass; ... end
end
在各种文件
,将类似:
moduel NameSpace
Class2 < SuperClass; ... end
end
所以,这里是我到目前为止已经开发出:
RESOURCE_NAMES = [
"Class1",
"Class2",
...
]
module NameSpace
RESOURCE_NAMES.each {|class_name|
Object.const_set(
class_name,
Class.new(SuperClass) do
CONTROLLER = class_name.downcase
@attributes = {}
# class variables
def self.show(id); ... end
def self.update(id); ... end
def self.destroy(id); ... end
end
)
}
end
但是,当我尝试运行控制台,并要求我的宝石,我得到这个输出:
require "rubygems"
require "mygem"
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/mygem-0.0.1/lib/mygem/restful_resource.rb:17: warning: already initialized constant CONTROLLER
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/mygem-0.0.1/lib/mygem/restful_resource.rb:17: warning: already initialized constant CONTROLLER
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/mygem-0.0.1/lib/mygem/restful_resource.rb:17: warning: already initialized constant CONTROLLER
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/mygem-0.0.1/lib/mygem/restful_resource.rb:17: warning: already initialized constant CONTROLLER
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/mygem-0.0.1/lib/mygem/restful_resource.rb:17: warning: already initialized constant CONTROLLER
,当我尝试做 > NameSpace::Cass1
,我得到
NameError: uninitialized constant NameSpace::Class1
我的问题是:我是关闭?我如何正确定义动态子类和命名空间类?
不知道我可以使用const_set那样..但我想这是有道理的,因为我设置了一个...常量。 – NullVoxPopuli