2013-01-25 52 views
0

我正在为一个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 

我的问题是:我是关闭?我如何正确定义动态子类和命名空间类?

回答

2

设置使用const_set控制器常量似乎工作:

const_set :CONTROLLER, class_name.downcase 

对于其他问题,您应该改变Object.const_set(只是const_set(,将你想要的方式为设定您的命名空间模块中。

+0

不知道我可以使用const_set那样..但我想这是有道理的,因为我设置了一个...常量。 – NullVoxPopuli

-1

想一想吗?

module NameSpace 

    class SuperClass 
    end 

    RESOURCE_NAMES = %w[ Class1 Class2 Class3 Class4 ] 

    RESOURCE_NAMES.each do |class_name| 
    eval("class #{ class_name } < SuperClass ; end") 
    end 

end 
+0

'eval'通常是“代码味道”的指标,您应该尽可能避免使用它。 –

相关问题