2010-04-13 4 views
15

J'ai une méthode ruby ​​(désactiver!) Qui est sur une classe activeRecord. Cependant, je n'arrive pas à trouver où cette méthode est déclarée.Comment trouver une méthode ruby?

Il y a eu de nombreux développeurs sur ce projet, donc ça pourrait être n'importe où. Il y a un désactiver! sur une classe non liée, mais il ne semble pas être appelé.

Des idées pour trouver toutes les superclasses pour une installation, ou où trouver le code pour désactiver !?

Répondre

15

Quand je dois trouver où une méthode est déclarée sur une classe, disent « modèle », je

Model.ancestors.find {|c| c.instance_methods(false).include? :deactivate! } 

Cette recherche l'arbre ancêtre dans le même ordre que Ruby fait pour la première qui a le méthode dans instance_methods(false), qui inclut uniquement les méthodes non héritées.

Note: avant Ruby 1.9, les méthodes ont été répertoriées comme des chaînes pas des symboles, il serait

Model.ancestors.find {|c| c.instance_methods(false).include?('deactivate!') } 
+0

Ha! Ancestors est une méthode Class, pas une méthode d'instance. Pas étonnant que je ne pouvais pas le trouver. Thx, Joe –

+0

Une autre réponse merveilleuse et succincte, @mckeed. Merci :) –

-1

Pour commencer, essayez la fonctionnalité Jump to Declaration de votre IDE. En fonction de la qualité de l'inférence de type statique de votre IDE, cela devrait vous mener là.

Si cela ne fonctionne pas, définissez un point d'arrêt sur cet appel, lancez le débogueur et entrez dans la méthode.

+2

-1. La question concerne Ruby. L'inférence de type statique n'existe pas. De plus, il y a 99% de chances qu'il n'utilise pas un IDE. – fig

+0

@ fig-gnuton: Diamondback Ruby, outils de développement Eclipse Ruby, Aptana RadRails, CodeGear 3rdRail, SapphireSteel Ruby en acier pour Visual Studio et le plugin NetBeans Ruby * font tous * des inférences de type statique pour Ruby depuis * ans *. Et à moins qu'il n'utilise le Bloc-notes, il utilise probablement un IDE ou un éditeur de texte programmable comme TextMate, Vim ou Emacs qui peut être * transformé * en un IDE. En outre, un débogueur fait partie de la bibliothèque standard, il ne nécessite pas d'IDE ni même de bibliothèque tierce (bien que la bibliothèque 'ruby-debug' soit bien meilleure, mais cela ne nécessite pas encore d'IDE). –

+0

Jorg - bien joué. Mais les chances sont qu'il n'utiliserait pas n'importe quoi qui ait l'inférence de type statique. Et le débogage ne semble pas être la meilleure approche par rapport à mckeed. – fig

17

première question serait la suivante: est-il une méthode réelle? Est-ce que obj.method(:deactivate!) génère une erreur?

Si elle ne le fait pas, vous pouvez utiliser Method#source_location (en Ruby 1.9 seulement, et backports ne peut supporter):

obj.method(:deactivate!).source_location 

Si elle ne soulève une NoMethodError, elle est gérée par method_missing. Cela le rend difficile à suivre. Si elle accepte les arguments, j'essaierais d'envoyer le mauvais type et d'utiliser le backtrace de l'exception levée.

Utilisez-vous state_machine? Si vous avez une transition d'événement appelée :deactivate, le modèle aura la méthode #deactivate! créée automatiquement.