ruby - 在字符串和类名之间转换

标签 ruby string class constants

我有一个字符串,其中包含一个类名。例如,它是一个包含“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

关于ruby - 在字符串和类名之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448293/

相关文章:

Ruby Git Diff 行信息解析器

ruby-on-rails - 使用 AWS Elastic Beanstalk 和 Ruby 容器设置私有(private) Github 访问

java - 使用java,如果字符串的出现为真,则查找给定范围内给定字母的出现

atol 操作的 C++ 错误

Python函数注释: class is not defined in method

java - Java 中的内部类 - 非静态变量错误

c++ - 如何将真实类型的汽车传递给模板

ruby-on-rails - Ruby on Rails - 选择数组中的所有 ID

ruby - NoMethodError(未定义方法 `[]' 为 nil :NilClass)

c++ - 如何在此代码中正确使用 strcmp() ?