我有一个包含类名的字符串.例如,它是包含“Article”的字符串.该字符串来自params [].我该怎么做才能使用这个字符串,好像它是一个类名?例如,我想做:
Article.all
等等.
任何想法?
解决方法
此解决方案优于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