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?

War es hilfreich?

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:

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top