2012-07-15 6 views
9

Angenommen, ich kann eine Zeichenfolge erstellen, die einer vorhandenen Klasse entspricht, wie rufe ich sie auf?Wie kann ich eine Klasse in Rails dynamisch aufrufen oder aufrufen?

Zum Beispiel habe ich mehrere Klassen:

  • MyClass1
  • MyClass2
  • MyClass3

Und ich möchte dynamisch jeder von ihnen aufrufen, indem eine Zeichenfolge erstellt, die ihren Namen übereinstimmt . Wenn sie alle Verfahren „Methoden“ hatte, wie ich so etwas tun ?:

(1..3).each do |n| 
    ("MyClass"+n).methods 
end 
+0

Sind Sie sicher, dass anonyme Klassen in einem Array nicht passen würde? Sobald Sie den Namespace per Iteration verwenden, sollten Sie Ihren Code überdenken. – Reactormonk

+0

Hi Tass, können Sie "anonyme Klassen in einem Array" erweitern? Ich bin mir ziemlich sicher, dass dies nicht der beste Weg ist, um ein Problem zu lösen, an dem ich gerade arbeite, aber ich dachte, ich sollte sowieso so etwas machen können. – comb

Antwort

14

constantize passt die Rechnung. Sie können mehr darüber lesen here. In Ihrem Fall wäre es so etwas wie:

(1..3).each do |n| 
    "MyClass#{n}".constantize.methods 
end 
+0

Danke! Im Anschluss an die Antwort von Zsquare endete ich mit zwei Antworten! klass = Object.const_get „MyClassName“ -oder klass = „MyClassName“ .constantize Sowohl die Klasse für das Rück Marke, was Spaß Sie sich interessieren. Während sich umsah, fand ich auch die Inflector-Klasse, die für das dynamische Erstellen von Klassennamen hilfreich ist. http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-camelize – comb

-3

können Sie auch tun -

(1..3).each {|n| eval "MyClass#{n}.methods"} 
+1

Downvote für 'eval'. Sie sollten nicht so etwas wie "eval" verwenden, außer Sie sind sicher, dass Sie müssen, und sind sicher, dass es keine andere Möglichkeit gibt, es zu tun. Und dann, wenn Sie sicher sind, dass Sie wahrscheinlich etwas falsch machen. – zsquare

+0

Wenn Sie es in Rubin machen müssen, d. H. Keine Rails, auf welche andere Weise würden Sie es aufrufen? – saihgala

+0

'Klassenname = 'Ganzzahl'; Kernel.const_get (Klassenname) .methods' – zsquare