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.

0voto

akshayKhot Points 800

En Ruby, vous utiliseriez la commande object.class.name comme suit.

module Bank
  class Account
  end
end

irb(main):005:0> account = Bank::Account.new
=> #<Bank::Account:0x0000000106115b00>
irb(main):006:0> account.class.name
=> "Bank::Account"
irb(main):008:0> account.class.name.split("::").last
=> "Account"

Dans Rails, comme d'autres l'ont mentionné, vous pouvez utiliser la fonction demodulize sur une chaîne de caractères, qui est ajoutée par Active Support. Elle supprime la partie module de l'expression constante dans la chaîne.

irb(main):014:0> account.class.name.demodulize
=> "Account"

En interne, cette méthode appelle le demodulize sur la méthode de la classe ActiveSupport::Inflector en se passant lui-même comme argument.

# File activesupport/lib/active_support/core_ext/string/inflections.rb, line 166
def demodulize
  ActiveSupport::Inflector.demodulize(self)
end

En Inflector.demodulize fait la même chose.

demodulize('ActiveSupport::Inflector::Inflections') # => "Inflections"
demodulize('Inflections')                           # => "Inflections"
demodulize('::Inflections')                         # => "Inflections"
demodulize('')                                      # => ""

Cependant, son implémentation interne est différente de la version simple ci-dessus.

# File activesupport/lib/active_support/inflector/methods.rb, line 228
def demodulize(path)
  path = path.to_s
  if i = path.rindex("::")
    path[(i + 2)..-1]
  else
    path
  end
end

Après avoir converti l'argument chemin en une chaîne de caractères, il obtient l'index de la dernière occurrence de :: en utilisant l'outil rindex fonction. Si elle existe, elle renvoie la sous-chaîne restante. Sinon, elle renvoie la chaîne originale. Le site array[n..-1] retourne la sous-chaîne de n au dernier caractère de la chaîne.

Je n'ai pas fait d'études de référence pour savoir pourquoi Rails utilise cette approche alternative en utilisant rindex (merci de commenter si vous savez pourquoi), mais en tant qu'amateur de lisibilité du code, j'aime bien la première qui utilise la balise split y last fonctions.

Fuente: Comment obtenir le nom de la classe d'un objet dans Rails ?

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