2009-05-22 17 views

Répondre

9

Mise à jour - Veuillez voir le commentaire ci-dessous qui lie à true explanation of protected/private in Ruby. C'était un préjugé profondément ancré de mes jours de Java, en effet. La seule partie importante qui reste à ma réponse est que les méthodes de contrôleur qui ne sont pas des actions ne doivent pas être public (ou au moins vos routes devraient les protéger).

L'héritage de table unique est un exemple parfait de quand protected est utile dans le niveau de modèle, car c'est l'une des utilisations les plus courantes de l'héritage là.

Au niveau du contrôleur, méthodes d'assistance définies sur ApplicationController doit être marqué comme protected - si elles étaient private les autres contrôleurs ne seraient pas en mesure d'y accéder, mais si elles sont public Rails les traiter comme des actions.

Personnellement, je trouve que j'utilise l'héritage de classe plus que beaucoup de mes amis et collègues, même dans les applications Rails. Parce que je l'utilise souvent (et en sortant de mes jours Java), je favorise protected pour toutes les méthodes d'aide pour donner la liberté à quiconque (généralement moi-même) qui veut prolonger la classe - sauf si je suis vraiment vraiment gêné par un, puis Je le marque private. :)

+0

Cela fait beaucoup de sens. (Je ne sais pas ce que STI est bien). –

+3

"les méthodes auxiliaires définies sur ApplicationController doivent être marquées comme protégées - si elles étaient privées, les autres contrôleurs ne pourraient pas y accéder" - fyi, ceci est incorrect. Voir l'exemple ici: http://pastie.org/842898. Protégé/privé dans Ruby est sur «soi» et les récepteurs, pas d'héritage. "Notez que, contrairement à des langages tels que Java, l'héritage ne joue absolument aucun rôle dans la détermination de la visibilité de la méthode dans Ruby." - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

Merci, Jordan. Tu as raison. J'ai ajouté une petite note. –

0

Je SingleTableInheritance

classe Personne < AR :: Base classe Enseignant < Personne calss Étudiant < Personne

Et j'utilise les méthodes protégées pour mettre en œuvre une méthode privée qui est commun pour les enseignants et étudiants :

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 

Avertissement: Il y a des plugins comme acte comme paranoïaque et d'autres pour mettre en œuvre la fonction J'utilise ici pour vous montrer le cas mais j'ai un paysage plus complexe, que j'ai simplifié ici pour arriver à votre point.

+0

fyi, votre exemple ci-dessus ne fonctionne pas correctement - vous pouvez appeler 'Person.reject_leaves (...)' sans problème. 'public/protected/private' dans ruby ​​ne sont pas des mots-clés - ce sont des invocations de méthode sur 'self' qui modifient l'état de' self'. Puisque vous changez ce que 'soi 'est quand vous faites' def self. reject_leaves' vous n'avez plus l'état 'protected' configuré. pour obtenir ce que vous voulez vous auriez besoin de quelque chose comme le deuxième exemple ('Prot2') ici: http://pastie.org/842952 –