Как создать экземпляр класса из строки имя в Rails?

Как мы можем создать экземпляр класса из это's имя строки в Руби-на-рельсах?

Например у нас это's имя в базу данных в формате, как на "класса" или "my_super_class_name и".

Как мы можем создать объект из него?

Решение:

Искал сам, но не нашел, так что вот. Руби-на-рельсах метод API

name = "ClassName"
instance = name.constantize.new  

Это может быть даже не отформатированы, мы можем методом string пользователей .классифицировать

name = "my_super_class"
instance = name.classify.constantize.new

Конечно может это и не очень 'рельсы путь', но он решает это'с целью.

Комментарии к вопросу (2)
Решение
klass = Object.const_get "ClassName"

о методах класса

class KlassExample
    def self.klass_method
        puts "Hello World from Class method"
    end
end
klass = Object.const_get "KlassExample"
klass.klass_method

irb(main):061:0> klass.klass_method
Hello World from Class method
Комментарии (9)

Другие могут также быть ищу альтернативу, которая не вызовет ошибки, если не удается найти класс. safe_constantize - это просто.

в

class MyClass
end

"my_class".classify.safe_constantize.new #  #
"omg_evil".classify.safe_constantize.new #  nil 
Комментарии (0)

Вы можете просто преобразовать строку и инициализации класса из него:

klass_name = "Module::ClassName"
klass_name.constantize

Чтобы инициализировать новый объект:

klass_name.constantize.new

Надеюсь, это окажется полезным. Спасибо!

Комментарии (0)

Я'м удивлены, что никто не рассматривает безопасность и хакерство в своих ответах. Создание произвольной строкой, которая, вероятно, пришел даже косвенно от ввода пользователя может привести к неприятностям и взлома. Мы все должны/должен быть белый, если мы не'будете уверены, что строки полностью управляться и контролироваться

def class_for(name)
  {
    "foo" => Foo,
    "bar" => Bar,
  }[name] || raise UnknownClass
end

class_for(name_wherever_this_came_from).create!(params_somehow)

Как вы знали бы, произвольно соответствующие параметры без вайтлиста будет сложно, но вы получаете идею.

Комментарии (0)