Как мы можем создать экземпляр класса из это's имя строки в Руби-на-рельсах?
Например у нас это's имя в базу данных в формате, как на "класса" или "my_super_class_name и".
Как мы можем создать объект из него?
Решение:
Искал сам, но не нашел, так что вот. Руби-на-рельсах метод API
name = "ClassName"
instance = name.constantize.new
Это может быть даже не отформатированы, мы можем методом string пользователей .классифицировать
name = "my_super_class"
instance = name.classify.constantize.new
Конечно может это и не очень 'рельсы путь', но он решает это'с целью.
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
Другие могут также быть ищу альтернативу, которая не вызовет ошибки, если не удается найти класс. safe_constantize
- это просто.
в
class MyClass
end
"my_class".classify.safe_constantize.new # #<MyClass:0x007fec3a96b8a0>
"omg_evil".classify.safe_constantize.new # nil
Вы можете просто преобразовать строку и инициализации класса из него:
klass_name = "Module::ClassName"
klass_name.constantize
Чтобы инициализировать новый объект:
klass_name.constantize.new
Надеюсь, это окажется полезным. Спасибо!
Я'м удивлены, что никто не рассматривает безопасность и хакерство в своих ответах. Создание произвольной строкой, которая, вероятно, пришел даже косвенно от ввода пользователя может привести к неприятностям и взлома. Мы все должны/должен быть белый, если мы не'будете уверены, что строки полностью управляться и контролироваться
def class_for(name)
{
"foo" => Foo,
"bar" => Bar,
}[name] || raise UnknownClass
end
class_for(name_wherever_this_came_from).create!(params_somehow)
Как вы знали бы, произвольно соответствующие параметры без вайтлиста будет сложно, но вы получаете идею.