2009-05-22 48 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

相关问题