這是一個簡單的解決方案。
變化:
- 沒有需要檢查的
USER_KEY
存在。
- 試着在接收器的模塊/類上查找常量(在你的情況下它將是控制器)。如果存在,則使用它,否則使用默認模塊/類(請參閱下面的默認模塊)。
。
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
說明
你看到的行爲是不特定的軌道,而是由於其中紅寶石查找常量,如果不通過::
明確範圍的(我所說的「默認」以上)。使用「當前執行代碼的詞法範圍」查找常量。這意味着ruby首先在執行代碼的模塊(或類)中查找常量,然後向外移動到每個連續的封閉模塊(或類),直到找到在該範圍內定義的常量。
在您的控制器中,您可以撥打authorize
。但是當authorize
正在執行時,當前正在執行的代碼是Auth
。所以這是查找常量的地方。如果Auth沒有USER_KEY
,但是封閉模塊具有它,則將使用封閉模塊。例如:
module Outer
USER_KEY = 'outer_key'
module Auth
# code here can access USER_KEY without specifying "Outer::"
# ...
end
end
這方面的一個特別的例子是頂級執行環境,其被視爲屬於Object
類。
USER_KEY = 'top-level-key'
module Auth
# code here can access the top-level USER_KEY (which is actually Object::USER_KEY)
# ...
end
一個缺陷是定義一個模塊或類與作用域運算符(::
):
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
注意,常數可以大大晚於所述方法被定義定義。當USER_KEY被訪問時,查詢只發生,所以這個工程太:
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.
謝謝詹姆斯,那正是我正在尋找的。 – user204078 2010-04-30 00:57:29