如何在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
我希望这个结果是有帮助的。 谢谢!