web-dev-qa-db-fra.com

Comment puis-je obtenir le nom d'une classe Ruby?

Comment puis-je obtenir le nom de la classe d'un objet ActiveRecord?

J'ai:

result = User.find(1)

J'ai essayé:

result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"

Je n'ai besoin que du nom de la classe, dans une chaîne (User dans ce cas). Y a-t-il une méthode pour cela?

Je sais que c'est assez élémentaire, mais j'ai consulté les documents de Rails et de Ruby et je ne l'ai pas trouvée.

371
andi

Vous voulez appeler . Name sur la classe de l'objet:

result.class.name
690
flicken

Voici la réponse correcte, extraite des commentaires de Daniel Rikowski et de pseidemann. J'en ai marre de devoir lire les commentaires pour trouver la bonne réponse ...

Si vous utilisez Rails (ActiveSupport):

result.class.name.demodulize

Si vous utilisez POR (plain-ol-Ruby):

result.class.name.split('::').last
108
Darren Hicks

result.class.to_s et result.class.name fonctionnent tous les deux.

33
tal

Si vous voulez obtenir un nom de classe à l'intérieur d'une méthode de classe, class.name ou self.class.name ne fonctionnera pas. Celles-ci vont simplement sortir Class, puisque la classe d'une classe est Class. Au lieu de cela, vous pouvez simplement utiliser name:

module Foo
  class Bar
    def self.say_name
      puts "I'm a #{name}!"
    end
  end
end

Foo::Bar.say_name

sortie:

I'm a Foo::Bar!
6
jayhendren

Dans mon cas, lorsque j'utilise quelque chose comme result.class.name j'ai quelque chose comme Module1::class_name. Mais si nous voulons seulement class_name, utilisez

result.class.table_name.singularize

2
Chivorn Kouch

Vous pouvez utiliser la méthode class pour obtenir la classe de tout objet en Ruby.

par exemple.

     array= [] 
     => []
     array.class
     => Array

     hash = {}
     => {}
     hash.class
     => Hash

     string = 'This is String'
     => "This is String"
     string.class
     => String 
2
MR. A