J'ai le nom d'une classe et je veux créer une instance de cette classe afin de pouvoir parcourir chaque attribut Rails présent dans le schéma de cette classe.
Comment pourrais-je m'y prendre?
Dans Rails vous pouvez simplement faire:
clazz = 'ExampleClass'.constantize
En rubis pur:
clazz = Object.const_get('ExampleClass')
avec des modules:
module Foo
class Bar
end
end
vous utiliseriez
> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
=> Foo::Bar
> clazz.new
=> #<Foo::Bar:0x0000010110a4f8>
Très simple dans Rails: utilisez String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
Essaye ça:
Kernel.const_get("MyClass").new
Ensuite, pour parcourir les variables d'instance d'un objet:
obj.instance_variables.each do |v|
# do something
end
module One
module Two
class Three
def say_hi
puts "say hi"
end
end
end
end
one = Object.const_get "One"
puts one.class # => Module
three = One::Two.const_get "Three"
puts three.class # => Class
three.new.say_hi # => "say hi"
Dans Ruby 2.0 et, éventuellement, des versions antérieures, Object.const_get
va effectuer récursivement une recherche sur un espace de noms tel que Foo::Bar
. L'exemple ci-dessus est celui où l'espace de noms est connu à l'avance et met en évidence le fait que const_get
peut être appelé directement sur les modules, par opposition à exclusivement sur Object
.