Comment puis-je convertir une chaîne de caractères à une méthode de classe?
C'est la façon de convertir une chaîne de caractères à une classe dans les Rails/Ruby:
p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
Mais si je suis de la récupération d'une méthode à partir d'un tableau/active record objet comme:
Post.description
mais il pourrait être
Post.anything
où tout est une chaîne de caractères comme anything = "description"
.
Cela est utile, car j'ai envie de revoir une très grande classe et de réduire les lignes de code et de la répétition. Comment puis-je le faire fonctionner?
- vous réalisez que vous avez seulement besoin de l'un de {const_get, eval, constantize}, droit?
- oui. bien sûr, je ne. comme je viens de tester les 3.
Vous devez vous connecter pour publier un commentaire.
Post.public_send(:anything)
(Ruby 1.9 ou plus tard)Tout eval peut être un outil utile pour ce genre de chose, et ceux issus d'autres milieux peuvent prendre de l'utiliser aussi souvent qu'on le ferait d'un ouvre-boîte, c'est réellement dangereux à utiliser avec tant de désinvolture. Eval implique que tout peut arriver si vous ne faites pas attention.
Une méthode plus sûre est ceci:
Objet#envoyer fera appel quelle que soit la méthode que vous voulez. Vous pouvez envoyer un Symbole ou une Chaîne de caractères et à condition que la méthode n'est pas privé ou protégé, devrait fonctionner.
Puisque c'est taged comme Ruby on Rails question, je vais essayer d'approfondir un peu.
Dans Rails 3, en supposant que
title
est le nom d'un champ dans un ActiveRecord objet, puis le suivant est valide:Essayez ceci:
Donc la syntaxe générale serait
a.<anything>(<any argument>)
.