428 votes

Comment obtenir le nom d'une classe Ruby ?

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

Je l'ai fait :

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 de caractères ( User dans ce cas). Existe-t-il une méthode pour cela ?

Je sais que c'est assez basique, mais j'ai cherché dans la documentation de Rails et de Ruby, et je ne l'ai pas trouvé.

1 votes

@Oliver N. : Avec des objets Ruby normaux, Object#class.inspect donne la même chose que Object#class.name alors que ce n'est pas le cas avec les objets ActiveRecord.

799voto

flicken Points 5887

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

result.class.name

5 votes

Lorsque je fais cela, j'obtiens les noms des modules avant, comme "Module::SubModule::Class", y a-t-il un moyen d'obtenir seulement "Class" ?

28 votes

@Abe : result.class.name.split('::').last

95 votes

@Abe : encore plus propre (ActiveSupport) : result.class.name.demodulize

134voto

Darren Hicks Points 1021

Voici la bonne réponse, extraite des commentaires de Daniel Rikowski et de pseidemann. Je suis fatigué de devoir fouiller dans 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

4 votes

Une réponse qui compare une solution à d'autres et prétend être meilleure, doit également expliquer pourquoi.

0 votes

Bien, techniquement, mon commentaire répondait à plus que ce qui était demandé à l'origine ;)

38voto

tal Points 2231

Les deux sites result.class.to_s y result.class.name travail.

42 votes

Mais conceptuellement, #name renvoie le nom, #to_s renvoie une représentation sous forme de chaîne, qui se trouve être identique au nom. Je m'en tiendrais à l'utilisation de #name, juste par souci de précision.

10voto

jayhendren Points 1679

Si vous voulez obtenir un nom de classe à l'intérieur d'une méthode de classe, class.name o self.class.name ne fonctionnera pas. Ils ne feront que produire 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

salida:

I'm a Foo::Bar!

1voto

Chivorn Kouch Points 186

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

result.class.table_name.singularize

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X