代码之家  ›  专栏  ›  技术社区  ›  unsorted

ruby将字符串中的类名转换为实际类

  •  74
  • unsorted  · 技术社区  · 14 年前

    我问的原因是因为我在用 acts_as_commentable find(commentable_id) 在上面。

    谢谢。

    6 回复  |  直到 14 年前
        1
  •  136
  •   fotanus    11 年前

    我想你想要的是 constantize

    这是一个RoR结构。我不知道是否有ruby core的

        2
  •  47
  •   jtbandes    14 年前
    "Object".constantize # => Object
    
        3
  •  35
  •   Khanh Pham    9 年前

    classify 要创建类名(仍然是字符串),请调用 constantize 尝试查找并返回类名常量(注意 class names are constants ).

    some_string.classify.constantize
    
        4
  •  23
  •   Edgar Ortega    5 年前

    红宝石色, Module.const_get 无法找到嵌套常量。例如,具有以下结构:

    module MyModule
      module MySubmodule
        class MyModel
        end
      end
    end
    

    您可以按如下方式使用它:

    Module.const_get("MyModule::MySubmodule::MyModel")
    MyModule.const_get("MySubmodule")
    MyModule::MySubmodule.const_get("MyModel")
    
        5
  •  7
  •   skalee    9 年前

    当ActiveSupport可用时(例如在Rails中): String#constantize String#safe_constantize ,即 "ClassName".constantize .

    纯红宝石: Module#const_get Object.const_get("ClassName") .

    在最近的rubies中,两者都使用嵌套在模块中的常量,比如 Object.const_get("Outer::Inner") .

        6
  •  6
  •   SSR    10 年前

    如果要将字符串转换为实际类名以访问模型或任何其他类

    str = "group class"
    
    > str.camelize.constantize 'or'
    > str.classify.constantize 'or'
    > str.titleize.constantize
    
    Example :
      def call_me(str)
        str.titleize.gsub(" ","").constantize.all
      end
    
    Call method : call_me("group class")
    
    Result:
      GroupClass Load (0.7ms) SELECT `group_classes`.* FROM `group_classes`