2016-05-07 58 views
2

我建立一個Rails的引擎,我發現,如果我生成一個控制器,像這樣rails g controller test它給了我下面的輸出:爲什麼在Rails引擎中明確要求應用程序控制器?

require_dependency "my_app/application_controller" 

module MyApp 
class TestController < ApplicationController 
end 
end 

爲什麼有必要要求發動機的應用控制器,嵌套module MyApp下應已經從主應用程序中消除了ApplicationController的歧義。

回答

0

所以,我沒有通過軌道源的一些挖掘和發現提交誰介紹這個功能(SHA:7c95be54)

修復發電機,以幫助曖昧ApplicationController問題

在發展模式,依賴關係在運行時動態加載, 使用const_missing。因此,當其中一個常量已經加載且const_missing未被觸發時,用戶可能以 結束,並出現意外的結果。

鑑於這樣的文件在發動機:

module Blog 
class PostsController < ApplicationController 
    end 
end 

如果你第一次加載,加​​載任何應用程序文件之前,它會 正確加載Blog::ApplicationController,因爲第二行 打const_missing。但是,如果您加載ApplicationController第一, 不斷將已加載,const_missing鉤不會被解僱 及成果PostsController將從 ApplicationController而不是Blog::ApplicationController繼承。

由於無法在AS::Dependencies中修復,所以最簡單的修復方法是隻需明確加載應用程序控制器即可 。

所以,正如人們所猜測的,這歸結爲一個自動加載問題!所以記住孩子們,在處理可能含糊不清的代碼時,總要明確你輸入的內容。 真正令人不安的是,由引擎引入的命名空間並不會提供太多的隔離,想象你在引擎中引用了一些其他的非rails類,並且包含主應用程序碰巧有一個同名的常量,同樣的問題將適用。

相關問題