Frage Geschützte und private Methoden in Rails


Die Sichtbarkeit der Methode in Ruby (öffentliche, geschützte und private Methoden) wurde an Orten wie dieser Blogbeitrag. Aber in Ruby on Rails scheint es etwas anders zu sein als in einer normalen Ruby-Anwendung, weil das Framework eingerichtet ist. Also, in Rails-Modellen, Controllern, Helfern, Tests usw., wann ist / ist es nicht angebracht, geschützte oder private Methoden zu verwenden?

Bearbeiten: Danke für die Antworten bis jetzt. Ich verstehe das Konzept von "geschützt" und "privat" in Ruby, aber ich suche mehr nach einer Erklärung der typischen Art und Weise, wie diese Sichtbarkeitstypen im Zusammenhang mit den verschiedenen Teilen einer Rails-App verwendet werden (Modelle, Controller, Helfer, Tests). . Zum Beispiel sind öffentliche Controller-Methoden Aktionsmethoden, geschützte Methoden im Application Controller werden für "Hilfsmethoden" verwendet, auf die mehrere Controller zugreifen müssen, usw.


76
2017-12-20 23:45


Ursprung


Antworten:


Für Modelle ist die Idee, dass die öffentlichen Methoden die öffentliche Schnittstelle der Klasse sind. Öffentliche Methoden sollen von anderen Objekten verwendet werden, während geschützte / private Methoden von außen verborgen werden sollen.

Dies ist die gleiche Vorgehensweise wie in anderen objektorientierten Sprachen.

Zum Controller und Tests, tun Sie einfach, wie Sie möchten. Sowohl Controller als auch Testklassen werden nur instanziiert und vom Framework aufgerufen (Ja, ich weiß, dass man theoretisch den Controller aus der Sicht bekommen kann, aber wenn man das macht, ist sowieso etwas komisch). Da niemand diese Dinge jemals direkt erschaffen wird, gibt es nichts gegen das man "schützen" kann.

Nachtrag / Korrektur: Für Controller sollten Sie die "Helfer" -Methoden als markieren geschützt privat, und nur die Aktionen selbst sollten öffentlich sein. Das Framework leitet eingehende HTTP-Aufrufe niemals an Aktionen / Methoden weiter, die nicht öffentlich sind. Daher sollten Ihre Hilfsmethoden auf diese Weise geschützt werden.

Für Helfer ist es egal, ob eine Methode geschützt oder privat ist, da sie immer "direkt" genannt werden.

In all diesen Fällen können Sie geschützte Sachen markieren, wenn es Ihnen das Verständnis erleichtert.


97
2018-01-05 17:47



Sie verwenden eine private Methode, wenn Sie möchten niemand anderes als self eine Methode verwenden. Sie verwenden eine geschützte Methode, wenn Sie nur etwas möchten self and is_a?(self) s kann anrufen.

Eine gute Verwendung von protected könnte sein, wenn Sie eine "virtuelle" Initialisierungsmethode hätten.

class Base
    def initialize()
        set_defaults()
        #other stuff
    end

    protected
    def set_defaults()
        # defaults for this type
        @foo = 7
        calculate_and_set_baz()
    end

    private
    def calculate_and_set_baz()
        @baz = "Something that only base classes have like a file handle or resource"
    end
end

class Derived < Base
    protected
    def set_defaults()
        @foo = 13
    end
end

@foo wird unterschiedliche Werte haben. und die abgeleiteten Instanzen haben kein @baz

Aktualisieren: Seit ich das geschrieben habe, haben sich einige Dinge in Ruby 2.0+ geändert. Aaron Patterson hat eine exzellente Beschreibung http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html


60
2017-12-21 00:08



Der Unterschied zwischen geschützt und   privat ist subtil. Wenn eine Methode ist   geschützt, kann es von jedem aufgerufen werden   Instanz der definierenden Klasse oder ihre   Unterklassen. Wenn eine Methode privat ist,   darf nur im Kontext aufgerufen werden   des aufrufenden Objekts --- es ist nie   möglich, um auf ein anderes Objekt zuzugreifen   Instanz private Methoden direkt,   auch wenn das Objekt gleich ist   Klasse als der Anrufer. Für geschützt   Methoden sind sie zugänglich von   Objekte der gleichen Klasse (oder   Kinder).

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility


9
2017-12-20 23:54



Sie scheinen eine gute Vorstellung von der Semantik der Klassensichtbarkeit (public / protected / private) zu haben, die auf Methoden angewendet wird. Alles, was ich anbieten kann, ist ein kurzer Überblick darüber, wie ich es in meinen Rails-Apps implementiere.

Ich implementiere geschützte Methoden im Basisanwendungscontroller, so dass sie von jedem Controller über Filter aufgerufen werden können (z. B. before_filter: method_foo). In ähnlicher Weise definiere ich geschützte Methoden für Modelle, die ich in allen verwenden möchte, in einem Basismodell, von dem alle erben.


3
2018-01-04 07:09



Obwohl Aktionen öffentliche Methoden eines Controllers sein müssen, sind nicht alle öffentlichen Methoden notwendigerweise Aktionen. Sie können verwenden hide_action wenn Sie eine Catch-All-Route wie /:controller/:action/:id oder wenn es deaktiviert ist (Standard in Rails 3), werden nur Methoden mit expliziten Routen aufgerufen.

Dies kann nützlich sein, wenn Sie die Controller-Instanz an eine andere Bibliothek wie die Liquid-Vorlagen-Engine übergeben, da Sie eine öffentliche Schnittstelle zur Verfügung stellen können, anstatt in Ihren Liquid-Filtern und -Tags send zu verwenden.


2
2018-01-07 11:36