Это решение лучше, чем Eval, как вы оцениваете Params хэш, который может манипулировать пользователем и может содержать вредные действия. Как правило: Никогда не оценивайте вход пользователя напрямую, это большое отверстие безопасности.
# Monkey patch for String class
class String
def to_class
klass = Kernel.const_get(self)
klass.is_a?(Class) ? klass : nil
rescue NameError
nil
end
end
# Examples
"Fixnum".to_class #=> Fixnum
"Something".to_class #=> nil
Update - это лучший вариант, который работает с пространствами имен:
# Monkey patch for String class
class String
def to_class
chain = self.split "::"
klass = Kernel
chain.each do |klass_string|
klass = klass.const_get klass_string
end
klass.is_a?(Class) ? klass : nil
rescue NameError
nil
end
end
Это не будет работать с классами с именами, такими как 'MyModule :: MyClass'. Для этого вам придется разделить на «::», а затем, например, использовать инъекцию с помощью const_get. – sepp2k
Да, он нуждается в дальнейшей доработке ... Спасибо! – khelll
Хорошая точка. Я добавил active_support def, который намного больше соответствует вашему (лучшему) предложению. –