2009-05-22 74 views

回答

9

更新 - 請參閱以下評論鏈接到true explanation of protected/private in Ruby。這確實是我Java時代遺留下來的一種深深的偏見。我的答案中唯一重要的部分是,不是行爲的控制器方法不應該是public(或者至少您的路由應該保護它們)。

Single Table Inheritance是protected在模型層中有用的一個很好的示例,因爲它是繼承的最常見用途之一。

在控制器層,在ApplicationController定義的helper方法應該被標記爲protected - 如果他們private其他控制器將無法訪問它們,但如果是public Rails會視他們爲行動。

就我個人而言,我發現我比我的許多朋友和同事更多地使用類繼承,即使在Rails應用程序中。因爲我經常使用它(並且從我的Java日子裏出來),所以我贊成所有幫助者方法的protected給予任何想擴展這個類的人(通常是我自己)的自由 - 除非我真的爲此感到非常尷尬,那麼我標記它private。 :)

+0

這很有道理。 (不知道STI是什麼)。 – 2009-05-22 22:37:25

0

我SingleTableInheritance

類Person < AR ::基地 班主任<人 CALSS學生<人

我使用受保護的方法來實現這是爲學生和教師共同的私有方法:

class Person < AR::base 
    def self.find(*args) 
    reject_leaves(super(*args)) 
    end 
protected 
    def self.reject_leaves(target) #like a private in Teacher and Student 
    case target 
     when Array target.select{|t| reject_leaves(t)} 
     when Person (target.leave_date < Date.today ? target : nil) 
     else target 
    end 
    end 
end 

聲明:有像插件一樣的偏執狂和其他實現該功能我用這裏向你展示案例,但我有一個更復雜的景觀,我在這裏簡化了你的觀點。

+0

fyi,你上面的例子不能正常工作 - 你可以調用`Person.reject_leaves(...)`沒有問題。 ruby中的'public/protected/private'不是關鍵字 - 它們是修改'self`狀態的`self`方法調用。既然你改變了自我,那麼你改變了自我。 reject_leaves`你不再設置'protected'狀態。得到你想要的東西,你需要像第二個例子(`Prot2`)這裏:http://pastie.org/842952 – 2010-02-25 20:18:13

相關問題