Это решение лучше, чем 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
Обновление - лучшая версия, которая работает с пространствами имен:
# 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