Die Sichtbarkeit von Methoden in Ruby (öffentliche, geschützte und private Methoden) wurde an Stellen wie diesem Blog-Beitrag ausführlich erläutert . In Ruby on Rails scheint es jedoch etwas anders zu sein als in einer normalen Ruby-Anwendung, da das Framework so eingerichtet ist. Wann ist / ist es in Rails-Modellen, Controllern, Helfern, Tests usw. angemessen, geschützte oder private Methoden zu verwenden?
Edit : Danke für die bisherigen Antworten. Ich verstehe das Konzept von geschützt und privat in Ruby, suche aber eher nach einer Erklärung für die typische Art und Weise, wie diese Sichtbarkeitstypen im Kontext der verschiedenen Teile einer Rails-App verwendet werden (Modelle, Controller, Helfer, Tests). . Beispielsweise sind öffentliche Controller-Methoden Aktionsmethoden, geschützte Methoden im Anwendungs-Controller werden für "Hilfsmethoden" verwendet, auf die mehrere Controller zugreifen müssen usw.
quelle
Sie verwenden eine private Methode , wenn Sie wollen , niemand anderes als
self
eine Methode zu verwenden. Sie verwenden eine geschützte Methode, wenn Sie etwas möchten, das nurself and is_a?(self)
s aufrufen kann.Eine gute Verwendung von protected könnte sein, wenn Sie eine "virtuelle" Initialisierungsmethode hatten.
@foo hat unterschiedliche Werte. und die abgeleiteten Instanzen haben kein @baz
Update: Seit ich dies geschrieben habe, haben sich einige Dinge in Ruby 2.0+ geändert. Aaron Patterson hat eine hervorragende Beschreibung: http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html
quelle
self and is_a?(self)
. Ich habe geschützte Methoden immer als in Kinderklassen verfügbar erklärt.http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility
quelle
Sie scheinen eine gute Vorstellung von der Semantik der Sichtbarkeit von Klassen (öffentlich / geschützt / privat) zu haben, die auf Methoden angewendet wird. Ich kann nur einen kurzen Überblick darüber geben, wie ich es in meinen Rails-Apps implementiere.
Ich implementiere geschützte Methoden im Basisanwendungs-Controller, damit sie von jedem Controller über Filter aufgerufen werden können (z. B. before_filter: method_foo). Auf ähnliche Weise definiere ich geschützte Methoden für Modelle, die ich in allen in einem Basismodell verwenden möchte, von dem sie alle erben.
quelle
Obwohl Aktionen öffentliche Methoden eines Controllers sein müssen, sind nicht alle öffentlichen Methoden notwendigerweise Aktionen. Sie können nur Methoden mit expliziten Routen aufrufen,
hide_action
wenn Sie eine Sammelroute wie verwenden/:controller/:action/:id
oder wenn diese deaktiviert ist (Standardeinstellung in Rails 3).Dies kann nützlich sein, wenn Sie die Controller-Instanz an eine andere Bibliothek wie die Liquid Template Engine übergeben, da Sie eine öffentliche Schnittstelle bereitstellen können, anstatt send in Ihren Liquid-Filtern und -Tags verwenden zu müssen.
quelle