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 ?
1 votes
@Oliver N. : Avec des objets Ruby normaux,
Object#class.inspect
donne la même chose queObject#class.name
alors que ce n'est pas le cas avec les objets ActiveRecord.