如果你要定製rails的違例輸出頁面的話的,一般會用這樣的**:
[code]
...def rescue_action_in_public(exception)
case exception
when ::actioncontroller::unknownaction
render_with_layout ....
when activerecord::recordnotfound
...end
endend[/code]
這裡唯一奇怪的地方就是::actioncontroller::unknownaction, 為什麼去掉開頭的::就會報錯說找不到unknownaction?看看原始碼,unknownaction類確實存在於actioncontroller模組中啊。
簡單說,ruby的namespace是從當前位置開始的找起的,而由::開頭訪問的是所謂根模組命名空間(root module namespace),好比絕對路徑。為了便於理解,我們來看個例子:
[code]
class obj
def self.p
"obj"
endend
module test
class obj
def self.p
"test::obj"
endend
class see
def self.p
puts obj.p
puts ::obj.p
endend
end[/code]
在irb中load這段**,並執行
[code]
>> test::see.p
test::obj
obj[/code]
顯然see看見obj會首先在同一命名域下搜尋。而外層的obj是和test同級別的所謂根命名,使用::才能直接引用以區別於test內部的obj。另外如果這時在see.p裡面插一句pp module.constants就能看見根模組空間的內容。
好了,我們已經看見「絕對」和「相對」的區別。回到主題,為什麼不能直接用actioncontroller::unknownaction呢?這裡涉及到rails匯入模組的一些「巫術」,使得當在controller裡用actioncontroller的時候指向的是
actionwebservice::container::actioncontroller。所以要加個::讓ruby知道用的是根級的actioncontroller的。
可見這是個命名衝突的rails bug, 框架應該對使用者隱藏掉這種晦澀的東西。然而這個hack也不失為解決一般的命名衝突情況的辦法。
struts2根命名空間和預設命名空間的區別
如果未指定命名空間,則命名空間預設為 namespace 預設命名空間裡的action可以處理任何命名空間下的action請求。例如,如果存在url為 barspace bar.action的請求,並且 barspace的命名空間下沒有名為bar的action,則預設命名空間下名為bar的actio...
tp框架中的根命名空間
根命名空間是乙個關鍵的概念,例如 think cache driver file類為例,think就是乙個根命名空間,其對應的初始命名空間目錄就是系統的類庫目錄 thinkphp library think 我們可以簡單的理解乙個根命名空間對應了乙個類庫包 分析 載入loader類 require ...
7 1 模組 7 2 命名空間
7.1 模組 我們常常把許多零散的小物件放在乙個盒子裡,或者放在乙個抽屜裡,這些小物件可能是鉛筆,墨水,字典等學習用品,也有可能是不相關的幾件物品。在程式中,相關的 不相關的 的組合,叫作模組。一般情況下,我們總是把功能相關的 放在乙個模組裡。把功能相關的程式 放在乙個模組裡,體現了模組的第乙個作用...