rails programas formularios ejemplos anidados ruby-on-rails ruby-on-rails-3 string class instantiation

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