忏悔:我只用私人和大众我的方法的知名度!你有没有在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