加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 在String和Classname之间转换

发布时间:2020-12-16 20:49:40 所属栏目:百科 来源:网络整理
导读:我有一个包含类名的字符串.例如,它是包含“Article”的字符串.该字符串来自params [].我该怎么做才能使用这个字符串,好像它是一个类名?例如,我想做: Article.all 等等. 任何想法? 解决方法 此解决方案优于eval,因为您正在评估可能由用户操纵并可能包含有
我有一个包含类名的字符串.例如,它是包含“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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读