2013-01-25 53 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'通常是「代碼味道」的指標,您應該儘可能避免使用它。 –

相關問題