懺悔:我只用私人和大衆我的方法的知名度!你有沒有在Rails中使用受保護的可見性?
我有一種感覺,這是一件壞事。但在Rails中,它似乎並不是一個問題。
有沒有人在Rails中有一個例子,它不會使用保護知名度?
懺悔:我只用私人和大衆我的方法的知名度!你有沒有在Rails中使用受保護的可見性?
我有一種感覺,這是一件壞事。但在Rails中,它似乎並不是一個問題。
有沒有人在Rails中有一個例子,它不會使用保護知名度?
更新 - 請參閱以下評論鏈接到true explanation of protected
/private
in Ruby。這確實是我Java時代遺留下來的一種深深的偏見。我的答案中唯一重要的部分是,不是行爲的控制器方法不應該是public
(或者至少您的路由應該保護它們)。
Single Table Inheritance是protected
在模型層中有用的一個很好的示例,因爲它是繼承的最常見用途之一。
在控制器層,在ApplicationController
定義的helper方法應該被標記爲protected
- 如果他們private
其他控制器將無法訪問它們,但如果是public
Rails會視他們爲行動。
就我個人而言,我發現我比我的許多朋友和同事更多地使用類繼承,即使在Rails應用程序中。因爲我經常使用它(並且從我的Java日子裏出來),所以我贊成所有幫助者方法的protected
給予任何想擴展這個類的人(通常是我自己)的自由 - 除非我真的爲此感到非常尷尬,那麼我標記它private
。 :)
我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
聲明:有像插件一樣的偏執狂和其他實現該功能我用這裏向你展示案例,但我有一個更復雜的景觀,我在這裏簡化了你的觀點。
fyi,你上面的例子不能正常工作 - 你可以調用`Person.reject_leaves(...)`沒有問題。 ruby中的'public/protected/private'不是關鍵字 - 它們是修改'self`狀態的`self`方法調用。既然你改變了自我,那麼你改變了自我。 reject_leaves`你不再設置'protected'狀態。得到你想要的東西,你需要像第二個例子(`Prot2`)這裏:http://pastie.org/842952 – 2010-02-25 20:18:13
這很有道理。 (不知道STI是什麼)。 – 2009-05-22 22:37:25