Haben Sie jemals das geschützte Sichtbarkeit in Rails verwenden?
-
23-08-2019 - |
Frage
Geständnis: Ich habe nur mit privat und Öffentlichkeit Sichtbarkeit für meine Methoden
Ich habe das Gefühl, das ist eine schlechte Sache ist. Aber in Rails es scheint nicht nur als ein Problem zu entwickeln.
Hat jemand ein Beispiel in Rails hat, wo es ein großer Fehler nicht geschützt nutzen würde Sichtbarkeit?
Lösung
Aktualisieren - Siehe Kommentar unten, die Links zu einem wahre Erklärung von protected
/ private
in Ruby . Das war ein tief sitzenden Vorurteile von meinem Java Tagen übrig bleiben, in der Tat. Die einzige wichtige Teil meiner Antwort bleibt, ist, dass die Controller-Methoden, die Aktionen sind nicht nicht public
werden (oder zumindest Ihre Routen sollten sie schützen).
Single Table Inheritance ist ein perfektes Beispiel dafür, wann protected
ist im Modell Tier hilfreich, da es eine der häufigsten Anwendungen der Vererbung ist es.
In der Steuerung Tier, Hilfsmethoden definiert auf ApplicationController
sollte als protected
markiert werden. - wenn sie die anderen Controller private
wurden würde sie nicht zugreifen können, aber wenn sie public
Rails sind, werden sie als Aktionen behandeln
Persönlich finde ich, dass ich die Klassenvererbung mehr verwenden, als viele meiner Freunde und Kollegen, auch in Rails-Anwendungen. Weil ich es verwenden oft (und kommt aus meinem Java Tage), ich bevorzugen protected
für alle Helfermethoden Freiheit zu jedermann geben (in der Regel selbst), die die Klasse erweitern will - es sei denn, ich bin wirklich sehr, sehr peinlich, eine, dann ich markiere es private
. :)
Andere Tipps
Ich habe SingleTableInheritance
class Person Und ich verwende die geschützten Methoden eine private Methode zu implementieren, die für Schüler und Lehrer gemeinsam ist: Disclaimer:. Es gibt Plugins wie Akt-as-paranoid und andere die Funktion, die ich hier verwenden, um implementieren Sie den Fall zu zeigen, aber ich habe eine komplexere Landschaft, dass ich hier vereinfacht, um Ihren Standpunkt zu bekommen 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