1

私はRESTfulAPIの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

しかし、コンソールを実行しようとしてgemが必要になると、次の出力が得られます。

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

私の質問は:私は近くにいますか?動的なサブクラス化および名前空間化されたクラスを適切に定義するにはどうすればよいですか?

4

2 に答える 2

2

const_setを使用してCONTROLLER定数を設定すると、機能するようです。

const_set :CONTROLLER, class_name.downcase

他の問題については、Object.const_set(単にconst_set(、に変更する必要があります。これにより、NameSpaceモジュールの定数が希望どおりに設定されます。

于 2013-01-25T03:08:43.183 に答える
-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
于 2014-05-11T14:34:05.797 に答える