Ich habe gerade hier geantwortet: https://stackoverflow.com/a/1568469/2449774
Zur Vereinfachung kopiert:
Mich erstaunen immer die "einfach nicht machen" Antworten von Leuten, die nichts über das zugrunde liegende Geschäftsbedürfnis des Fragestellers wissen. Ja, im Allgemeinen sollte dies vermieden werden. Aber es gibt Umstände, in denen es sowohl angemessen als auch äußerst nützlich ist. Ich hatte selbst gerade erst eine.
Hier war meine Lösung:
def find_current_user
(1..Kernel.caller.length).each do |n|
RubyVM::DebugInspector.open do |i|
current_user = eval "current_user rescue nil", i.frame_binding(n)
return current_user unless current_user.nil?
end
end
return nil
end
Dies geht den Stapel rückwärts durch und sucht nach einem Rahmen, der auf current_user
reagiert. Wenn keiner gefunden wird, gibt es nil zurück. Es könnte robuster gemacht werden, indem der erwartete Rückgabetyp bestätigt wird, und möglicherweise auch der Eigentümer des Rahmens als Controller-Typ bestätigt wird, funktioniert aber im Allgemeinen einfach wunderbar.