2017-08-18 13 views
1

私はGrape APIを使っています。私は、エンドポイントを動的にマウントするために使用しているurl属性を持つモデルを持っています。私はそれらをバージョンアップできるようにする必要があり、生成されたときに名前空間が正しくなるようにするのは難しいです。モジュールネームスペース内で動的に名前付きクラスを作成する

モジュール内にクラスを作成すると、そのクラスは名前空間になります。

module MyModule 
    module SubModule 
    class MyClass 
    end 
    end 
end 
=> nil 
MyModule::SubModule::MyClass 
=> MyModule::SubModule::MyClass 

しかし、動的にモジュール内にクラスを作成すると、名前空間にはなりません。

module MyModule 
    module SubModule 
    dynamic_name = "ClassName" 
    Object.const_set(dynamic_name, Class.new) 
    end 
end 
=> ClassName 
MyModule::SubModule::ClassName 
NameError: uninitialized constant MyModule::SubModule::ClassName 
ClassName 
=> ClassName 

ダイナミックに作成されたクラスを名前空間にする方法はありますか?

+0

'const_set'を実行するだけで、' Object.'の必要はありません –

+0

さて、明示的に 'Object'に定数を設定するようにRubyに指示しますが、どうしましたか? Rubyに*まったく同じ*のどこかに定数を設定するよう明示的に*指示することができます。 –

+0

ありがとうマックス!ジョルグ、そうだけど、この場合、マックスは頭に釘を打つ。私は現在のスコープでそれを設定する必要があります。 –

答えて

1

Object.const_setは、明示的にオブジェクト名前空間の定数をルート名前空間に設定します。 Objectなしでconst_setを使用すると、現在の名前空間が何であっても定数が設定されます。例ではMyModule::SubModuleです。

関連する問題