Hier ist eine einfache Lösung.
Änderungen:
- Keine Notwendigkeit, die Existenz von
USER_KEY
zu überprüfen.
- Versuchen Sie, die Konstante auf dem Modul/der Klasse des Empfängers nachzuschlagen (in Ihrem Fall wäre es der Controller). Wenn es existiert, benutze es, ansonsten verwende das Standardmodul/die Standardklasse (siehe unten für den Standard).
.
module Auth
USER_KEY = "user"
def authorize
user_key = self.class.const_defined?(:USER_KEY) ? self.class::USER_KEY : USER_KEY
user_id = session[user_key]
def
end
Erklärung
Das Verhalten ist Sie sehen auf Schienen nicht spezifisch, ist aber aufgrund wo Rubin für Konstanten sieht, wenn nicht explizit über ::
scoped (was ich die „default“ nennen über). Konstanten werden mit dem "lexikalischen Umfang des aktuell ausgeführten Codes" gesucht. Dies bedeutet, dass Ruby zuerst im Modul (oder der Klasse) des Ausführungscodes nach der Konstante sucht und dann nach außen zu jedem nachfolgenden einschließenden Modul (oder jeder Klasse) wechselt, bis es die Konstante findet, die für diesen Bereich definiert ist.
In Ihrer Steuerung rufen Sie authorize
. Aber wenn authorize
ausgeführt wird, ist der aktuell ausführende Code in Auth
. Hier werden Konstanten gesucht. Wenn Auth nicht über USER_KEY
verfügt, sondern über ein umschließendes Modul verfügt, wird das umschließende verwendet. Beispiel:
module Outer
USER_KEY = 'outer_key'
module Auth
# code here can access USER_KEY without specifying "Outer::"
# ...
end
end
Ein Spezialfall hiervon ist die Top-Level-Ausführungsumgebung, die Object
als zugehörig zu der Klasse behandelt wird.
USER_KEY = 'top-level-key'
module Auth
# code here can access the top-level USER_KEY (which is actually Object::USER_KEY)
# ...
end
One pitfall wird definiert, ein Modul oder eine Klasse mit dem Scoping Operator (::
):
module Outer
USER_KEY = 'outer_key'
end
module Outer::Auth
# methods here won't be able to use USER_KEY,
# because Outer isn't lexically enclosing Auth.
# ...
end
anzumerken, dass die konstanten viel später definiert werden kann als das Verfahren definiert ist. Das Nachschlagen geschieht nur, wenn user_key zugegriffen wird, so funktioniert dies auch:
module Auth
# don't define USER_KEY yet
# ...
end
# you can't call authorize here or you'll get an uninitialized constant error
Auth::USER_KEY = 'user'
# now you can call authorize.
Danke James, das war genau das was ich gesucht habe. – user204078