Holen Sie sich Klassennamen aus einem Modul
Wie kann ich aus einem Modul den Klassennamen der Klasse, die das Modul enthalten ist ?
module ActMethods
def some_method(*attr_names)
cls = self.class # this doesn't work
end
end
Wie kann ich mich in den cls variable der name der Klasse, die mit diesem Modul ist geladen ?
- Arbeiten sollte! Möglicherweise müssen Sie selbst.Klasse.name
- Beachten Sie, dass wenn die Klasse erweitert, in der anonyme, drucken Sie dann aus self.class oder sich selbst.Klasse.name wieder leer, was verwirrend sein kann. Diese diesem Fall, es ist auch gut zu prüfen selbst.Klasse.Superklasse.
self.class
nicht für mich arbeiten.self.class.name
gibt "Modul". Ich denke, es hat mit der Tatsache zu tun, dass die Klasse, in die mein Modul ist enthalten, erbt von ActiveRecord::Base (Rails 3.2.8), aber ich bin mir nicht sicher, warum oder wie das ist, sich einzumischen.- Es herausgefunden, und ich war richtig über die es im Zusammenhang mit ActiveRecord. Siehe diesem Artikel auf ActiveSupport::Besorgnis
Du musst angemeldet sein, um einen Kommentar abzugeben.
self.class
bekommen hat Sie die Klasse für das Objekt die Methode aufgerufen wird. Vorausgesetzt, das Modul war in einer Klasse, dies ist die Klasse, die das Modul oder eine Unterklasse davon. Wenn Sie wirklich wollen einfach nur die Namen, die Sie verwenden könnenself.class.name
statt.Wenn Sie erweitert eine Klasse mit dem Modul, und Sie wollen, dass die Klasse, die Sie tun können
cls = self
(odercls = name
wenn Sie möchten, dass der name der Klasse als string).Wenn keine der oben genannten hilft, sollten Sie klären, was Sie wollen.
wenn
self
ist nicht eine option aus irgendeinem Grund, alternative könnteancestors
http://ruby-doc.org/core-2.0/Module.html#method-i-ancestorsFunktioniert für mich. Wie sepp sagte, Sie haben, um es auch für Sie zu arbeiten.
PS: Für den Allgemeinen Fall beantworten, siehe sepp2k Antwort.
Wenn Sie das Modul in den Controller nur, möchten Sie vielleicht zu prüfen, mit
controller_name.classify
um den Namen des entsprechenden Modells. Beispiel:Von dort aus konnte man die eigentliche Klasse (wenn Sie möchten), indem er
.constantize
auf das Ergebnis.