2011-02-13 67 views
0

我使用了一些命名空間的控制器,也從一個父控制器繼承。在每個子類,我需要有(for anyone wondering why...):如何我從其父子類控制器的CONTROLLER_NAME?

class Fruits::ApplesController < FruitsController 
    # controller_name below is 'apples' 
    require_dependency "fruits/#{controller_name}" 
    ... 
end 

所以,既然我寧願在我父類有require_dependency線一次我試圖將它移到FruitsController,但問題是,CONTROLLER_NAME現等於「水果」 ..

class FruitsController < ApplicationController 
    # controller_name is 'fruits' no matter which subclassed controller is called 
    require_dependency "fruits/#{controller_name}" 
    ... 
end 

所以,我怎麼能正確地得到FruitsController子類的控制器name的值,這樣我可以保持這種require_dependency行了我的子類的? controller_path也沒有幫助。

謝謝!

回答

0

正如我在我的迴應上述於@ElliotNelson,這裏是我已經放在我FruitsController代碼已經讓我重新的因素我原來的代碼:

def self.inherited(subclass)  
    subclass.require_dependency subclass.controller_name 
    super 
end 
0

在加載父類期間,Fruits類中的上述require語句僅執行一次,這意味着子類不會再次執行它。請檢查下面的例子:

class A 
    puts name 
end 

class B < A 
end 
#=> A 

所以,你必須執行每個子類單獨的要求,因此你不能重構它你想要的方式。

+0

感謝您的解釋@khelll – Carter 2011-02-14 01:35:30

2

正如你所寫,你的「require_dependency」語句只在父裝載時執行一次。

你可能使用類#繼承的方法需要你的依賴,像這樣(未測試的代碼)。 (!順便說一句感謝很多)

class FruitsController < ApplicationController 
    def self.inherited(subclass) 
    subclass.require_dependency subclass.to_s.underscore 
    end 
end 
+0

真棒,非常感謝!我不得不在`end`的末尾添加一個調用它的工作,並且我選擇使用`subclass.controller_name`而不是`subclass.to_s.underscore`,因爲它返回我需要的東西(已經強調並且沒有_controller,因此它與型號名稱相匹配)。我將發佈下面的工作代碼... – Carter 2011-02-14 01:29:55

相關問題