ruby on rails - programas - ¿Cómo crear una instancia de la clase de la cadena de nombre en Rails?
ejemplos de programas en ruby (4)
Me sorprende que nadie esté considerando la seguridad y piratear sus respuestas. La creación de una cadena arbitraria que probablemente provenga incluso de manera indirecta de la entrada del usuario es para solucionar problemas y piratería. Todos debemos / debemos estar en la lista blanca a menos que estemos seguros de que la cadena está completamente controlada y monitoreada
def class_for(name)
{
"foo" => Foo,
"bar" => Bar,
}[name] || raise UnknownClass
end
class_for(name_wherever_this_came_from).create!(params_somehow)
Cómo conocería los parámetros adecuados arbitrariamente sin tener una lista blanca sería un desafío, pero se entiende la idea.
¿Cómo podemos instanciar la clase de su cadena de nombre en Ruby-on-Rails?
Por ejemplo, tenemos su nombre en la base de datos en formato como "ClassName" o "my_super_class_name".
¿Cómo podemos crear un objeto a partir de él?
Solución:
Estaba buscándolo yo mismo, pero no lo encontré, así que aquí está. Método de la API Ruby-on-Rails
name = "ClassName"
instance = name.constantize.new
Puede incluso no formatearse, podemos usar el método de cadena .classify
name = "my_super_class"
instance = name.classify.constantize.new
Por supuesto, tal vez esto no sea muy ''Rails way'', pero resuelve su propósito.
Otros también pueden estar buscando una alternativa que no arroje un error si no puede encontrar la clase. safe_constantize
es solo eso.
class MyClass
end
"my_class".classify.safe_constantize.new # #<MyClass:0x007fec3a96b8a0>
"omg_evil".classify.safe_constantize.new # nil
Simplemente puede convertir una cadena e inicializar una clase a partir de:
klass_name = "Module::ClassName"
klass_name.constantize
Para inicializar un nuevo objeto:
klass_name.constantize.new
Espero que esto sea útil. ¡Gracias!
klass = Object.const_get "ClassName"
sobre los métodos de clase
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