如何在Rails中实例化名称string中的类?

我们如何在Ruby-on-Rails中从它的名字string中实例化类?

例如,我们在数据库中以“ClassName”或“my_super_class_name”的格式命名。

我们如何从中创build对象?

解:

正在找我自己,但没有find,所以在这里。 Ruby-on-Rails API方法

name = "ClassName" instance = name.constantize.new 

它甚至可以不格式化,我们可以用户string方法.classify

 name = "my_super_class" instance = name.classify.constantize.new 

当然也许这不是'Rails的方式',但它解决了它的目的。

 klass = Object.const_get "ClassName" 

关于类的方法

 class KlassExample def self.klass_method puts "Hello World from Class method" end end klass = Object.const_get "KlassExample" klass.klass_method irb(main):061:0> klass.klass_method Hello World from Class method 

其他人也可能正在寻找一种替代scheme,如果它找不到类,就不会抛出错误。 safe_constantize就是这样。

 class MyClass end "my_class".classify.safe_constantize.new # #<MyClass:0x007fec3a96b8a0> "omg_evil".classify.safe_constantize.new # nil 

我很惊讶没有人正在考虑安全和黑客的答复。 实例化一个可能来自用户input的间接string,这是一个麻烦和黑客行为。 我们都应该/必须白名单,除非我们确定string是完全控制和监控的

 def class_for(name) { "foo" => Foo, "bar" => Bar, }[name] || raise UnknownClass end class_for(name_wherever_this_came_from).create!(params_somehow) 

如果没有白名单,你会如何随意地知道适当的参数将是具有挑战性的,但你明白了。

您可以简单地转换一个string,并通过以下方法初始化一个类:

 klass_name = "Module::ClassName" klass_name.constantize 

要初始化一个新的对象:

 klass_name.constantize.new 

我希望这个结果是有帮助的。 谢谢!