Rails, Controller und Metaprogramming

Hi!

Ich habe mich hier an etwas Metaprogramming versucht und bin auf ein
Problem mit Rails gestoßen. Ein Auszug aus meinem AdminController:

require “admin/#{@modul}”

self.class.instance_eval do
include(“Admin::#{@modul}”.constantize)
# Bitte an dieser Stelle keine Hinweise auf Validierung und
Sicherheit… :slight_smile:
end

Geladen wird hier ein Modul aus einer externen Datei, z.B.:

module Admin::BlaBla
def muh
end
end

An für sich funktioniert das ja auch wunderbar, zumindestens lokal…
Wenn ich das jetzt aber auf einem mongrel laufen lasse bekomme ich
Probleme. So weit ich das verstanden habe, hält der Mongrel das (also
die erweiterte Instanz) jetzt ja so die ganze Zeit im RAM was
natürlich beim laden von anderen Modulen Probleme verursacht.

Nun meine Frage: Gibt es eine gegenteilige Methode zu instance_eval um
die Methoden wieder aus der Instanz herauszubekommen?

Oder gibt es generell einen viel schöneren Weg seine Rails Controller
etwas zu modularisieren? Ich möchte hierfür nicht lauter
Admin…blabla Controller anlegen, sondern ich finde die Möglichkeit
schon recht sexy einen Controller zu haben, der entsprechend die
Module “einmixt”.

Danke für eure Hilfe!

Gruss,
Benny

On Monday 26 November 2007, Benjamin Lutz wrote:

Sicherheit… :slight_smile: end

Geladen wird hier ein Modul aus einer externen Datei, z.B.:

module Admin::BlaBla
def muh
end
end

An für sich funktioniert das ja auch wunderbar, zumindestens lokal…

Was funktioniert denn? Mir ist nicht klar, was du überhaupt erreichen
möchtest.

Wenn du mehrere Controller haben willst, die im Wesentlichen das Gleiche
tun, dann hast du zwei grundsätzliche Möglichkeiten: leite die
Controller von einander ab, ober – schöner – pack die Gemeinsamkeiten
in ein Modul und include das in beide Controller.

Wenn es systematische Zusammenhänge zwischen den normalen Controllern
und ihren Admin-Varianten gibt, ist Metaprogrammierung vermutlich
sinnvoll. Allerdings bist du da mit instance_eval sehr wahrscheinlich
auf dem falschen Weg; der liegt eher in Richtung class_eval.

Michael


Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/