如何从包含类名称的字符串中调用类?(我想我可以做case/when,但这似乎很难看。)
我这样问的原因是因为我使用的是acts_as_commentable
插件和其他插件,这些插件将commentable_type存储为列。我希望能够调用任何特定的可注释类来对其执行find(commentable_id)
。
谢谢。
发布于 2010-08-12 09:08:00
我想你想要的是constantize
这是一个RoR构造。我不知道有没有ruby内核的
发布于 2010-08-12 09:08:26
"Object".constantize # => Object
发布于 2012-03-28 08:13:55
这取决于字符串...
如果它已经具有适当的形状(大小写、复数等),并且将直接映射到对象,则:
Rails:
'User'.constantize # => User
Ruby:
Module.const_get 'User' # => User
但除此之外(注意大小写的不同):
'user'.constantize # => NameError: wrong constant name user
Module.const_get 'user' # => NameError: wrong constant name user
因此,你一定要问...源字符串是单数还是复数(是否引用了表?),是多个单词和AlreadyCamelCased还是is_it_underscored?
对于Rails,您可以使用以下工具:
使用camelize将字符串转换为UpperCamelCase字符串,甚至可以处理下划线和正斜杠:
'object'.constantize # => NameError: wrong constant name object
'object'.camelize # => "Object"
'object'.camelize.constantize # => Object
'active_model/errors'.camelize # => "ActiveModel::Errors"
'active_model/errors'.camelize.constantize # => ActiveModel::Errors
使用classify转换一个字符串,它甚至可以是复数(例如,它可能是一个表引用),以创建一个类名(仍然是一个字符串),然后调用constantize来尝试查找并返回类名常量(请注意,在Ruby class names are constants中):
'users'.classify => "User" # a string
'users'.classify.constantize # => User
'user'.classify => "User" # a string
'user'.classify.constantize # => User
'ham_and_eggs'.classify # => "HamAndEgg"
在POR (Plain Old Ruby)中,你有capitalize,但它只适用于第一个单词:
Module.const_get 'user'.capitalize => User
...otherwise您必须使用条带化、拆分、映射、连接等基本工具来实现适当的操作:
class HamAndEgg end # => nil
Module.const_get ' ham and eggs '.strip.gsub(/s$/,'').split(' ').map{|w| w.capitalize}.join # => HamAndEgg
https://stackoverflow.com/questions/3464007
复制相似问题