Kürzlich hatten wir ein Problem, bei dem nach einer Reihe von Commits ein Backend-Prozess nicht lief. Wir waren gute Jungs und Mädchen und führten nach jedem Check-In rake test
aus, aber aufgrund einiger Eigenheiten beim Laden von Rails-Bibliotheken trat der Fehler nur auf, wenn wir es direkt von Mongrel im Produktionsmodus ausführten.
Ich habe den Bug verfolgt und es lag daran, dass ein neues Rails-Gem eine Methode in der String-Klasse überschrieben hat, was eine schmale Verwendung im Laufzeit-Rails-Code gebrochen hat.
Auf jeden Fall, lange Rede, kurzer Sinn, gibt es eine Möglichkeit, Ruby zur Laufzeit zu fragen, wo eine Methode definiert wurde? Etwas wie whereami(:foo)
, das /pfad/zu/einer/datei.rb Zeile #45
zurückgibt? In diesem Fall wäre es nicht hilfreich, mir zu sagen, dass es in der Klasse String definiert wurde, weil es von einer Bibliothek überladen wurde.
Ich kann nicht garantieren, dass die Quelle in meinem Projekt existiert, also wird das Suchen nach 'def foo'
nicht unbedingt das liefern, was ich brauche, ganz zu schweigen davon, wenn ich viele def foo
s habe, manchmal weiß ich erst zur Laufzeit, welche ich benutze.
1 Stimmen
In Ruby 1.8.7 wurde eine spezielle Methode hinzugefügt, um diese Informationen speziell zu finden (und sie ist immer noch in 1.9.3 vorhanden) ... Details in meiner Antwort unten.
0 Stimmen
Vor langer Zeit habe ich einen Artikel geschrieben, der diese Fragen beantwortet blog.widefix.com/find-method-source-location