2012-07-15 14 views
9

Suponiendo que puedo construir una cadena que coincida con una clase existente, ¿cómo la invoco?¿Cómo invoco dinámicamente o llamo a una clase en Rails?

Por ejemplo, tengo varias clases:

  • MyClass1
  • miclase2
  • MyClass3

y quiero invocar dinámicamente cada uno de ellos mediante la construcción de una cadena que coincide con sus nombres . Si todos ellos tenían el método de "métodos", ¿cómo puedo hacer algo como esto ?:

(1..3).each do |n| 
    ("MyClass"+n).methods 
end 
+0

¿Seguro clases anónimas en una matriz no cabrían? Tan pronto como empiece a usar el espacio de nombres por iteración, debe reconsiderar su código. – Reactormonk

+0

Hola Tass, ¿puedes ampliar las "clases anónimas en una matriz"? Estoy bastante seguro de que esta no es la mejor manera de resolver un problema en el que estoy trabajando actualmente, pero de todos modos pensé que debería saber cómo hacer algo como esto. – comb

Respuesta

14

constantize encaja a la perfección. Puede leer más al respecto here. En su caso, sería algo así como:

(1..3).each do |n| 
    "MyClass#{n}".constantize.methods 
end 
+0

¡Gracias! Siguiendo con la respuesta de zsquare, ¡terminé con dos respuestas! Klass = Object.const_get "MyClassName" -o- Klass = "MyClassName" .constantize Ambos devuelven la clase por cualquier marca de diversión que le interesa. Mientras que mirar a su alrededor, también encontré la clase Inflector es útil para construir dinámicamente nombres de clase. http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-camelize – comb

-3

también se puede hacer -

(1..3).each {|n| eval "MyClass#{n}.methods"} 
+1

Voto a favor de 'eval'. No deberías usar algo como 'eval' a menos que estés seguro de que debes hacerlo, y estés seguro de que NO HAY otra forma de hacerlo. Y luego, si estás seguro de que probablemente estás haciendo algo mal. – zsquare

+0

si necesita hacerlo en ruby, es decir, sin raíles, ¿de qué otra manera lo invocaría? – saihgala

+0

'classname = 'Entero'; Kernel.const_get (classname) .methods' – zsquare

Cuestiones relacionadas