Wie rufe ich eine Klasse aus einer Zeichenfolge auf, die diesen Klassennamen enthält? (Ich denke, ich könnte Fall / wann tun, aber das scheint hässlich.)
Der Grund, den ich frage, ist, dass ich acts_as_commentable
unter anderem das Plugin verwende und diese den commentable_type als Spalte speichern. Ich möchte in der Lage sein, jede bestimmte kommentierbare Klasse aufzurufen, um eine find(commentable_id)
Aktion durchzuführen.
Vielen Dank.
ruby-on-rails
unsortiert
quelle
quelle
Module.const_get
. Der Vorteilconstantize
ist , dass es auch bei tief verschachtelten Namensräumen funktioniert, so dass Sie tun könnten'Functional::Collections::LazyList'.constantize
und die Klasse LazyList von den Modulsammlungen im Modul Funktions, während mit bekommenconst_get
, würden Sie so etwas wie zu tun haben'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
.quelle
.constantize
eine Rails-Methode ist, die Sie in RubyEine Zeichenfolge, erste Anruf gegeben Klassifizieren einen Klassennamen (noch ein String), dann rufen erstellen constantize zu versuchen , den Klassennamen Konstante (beachten Sie, dass zu finden und das Rückklassennamen Konstanten sind ).
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich möchte nur diese Notiz hinterlassen, sie kann für andere hilfreich sein.
Module.const_get
Kann im einfachen Ruby verschachtelte Konstanten finden. Zum Beispiel mit folgender Struktur:Sie können es wie folgt verwenden:
quelle
Wenn Active verfügbar ist (zB in Rails):
String#constantize
oderString#safe_constantize
, das heißt"ClassName".constantize
.In reinem Ruby:
Module#const_get
normalerweiseObject.const_get("ClassName")
.In den letzten Rubinen arbeiten beide mit Konstanten, die in Modulen wie in verschachtelt sind
Object.const_get("Outer::Inner")
.quelle
Wenn Sie eine Zeichenfolge in einen tatsächlichen Klassennamen konvertieren möchten, um auf das Modell oder eine andere Klasse zuzugreifen
quelle