Interessante Frage! Ich habe alle Bibliotheksquellen eines Schienenprojekts für 'hash-with-ivars'
durchsucht und nur einen einzigen Platz gefunden: den psych
ruby library zum (De-) Serialisieren beliebiger Objekte zu und von YAML. Insbesondere sind dies Links zu dem Quellcode für reading und writing dieser YAML-Struktur.
In Chapter 7 der Rails Tutorial, diese Ausgabe kommt als die Ausgabe der debug(params)
Befehl, den Sie aufgefordert werden, in eine Vorlage zu setzen. Der Befehl debug
ruft anscheinend die psych
-Bibliothek auf, um eine lesbare Darstellung des Objekts anzuzeigen (params
in diesem Fall).
Nun params
- die universelle Rails Datenstruktur Parameter von URLs oder Formen übergeben zu halten - ist ein Objekt, das wie ein Hash
verhält, aber nicht rein hash: es ist eine Instanz der Klasse ActionController::Parameters
, die eine ist Unterklasse von Hash
, lassen Sie uns die class definition sehen:
module ActionController
# ...
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
end
end
während HashWithIndifferentAccess
ist eine direkte Unterklasse von Hash
.
Als eine Unterklasse von Hash
kann das Objekt params
andere Daten neben dem Hash selbst enthalten und das ist, was psych
tatsächlich unterstützt, wenn Sie versuchen, das Objekt in einer lesbaren Form zu drucken. Neben dem Drucken aller Hash-Elemente (unter dem Schlüssel elements
) versucht es auch, alle Instanzvariablen des Objekts aufzulisten und druckt es unter dem Schlüssel ivars
.
Also, alles in allem, der Debug-Druck sagt einfach, dass das gedebuggt Objekt ist eine Instanz der ActionController::Parameters
-Klasse, die eine Unterklasse von Hash
ist, dass es der Hash-Elemente neben hat auch eine @permitted
Instanzvariable definiert und es ist derzeit auf false
eingestellt. Die beiden Elemente controller
und action
sind Parameter, die intern von Rails zum Routing verwendet werden.
Wenn Sie die Quelle der Klasse Blick in wieder, werden Sie in der Tat die @permitted
Variable direkt im Konstruktor finden:
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
schließlich aus dem documentation wir, dass die @permitted
Variable den Zustand schließen kann, hält die Paramterlaubnis. I.e. es wird auf true
nachdem die params unter Verwendung der permit
Methode zulässig:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
Update: warum das Debug-Ausgabe des RailsTutorial am RailsTutorial
Die Debug-Ausgabe unterscheidet unterscheidet ein wenig - es funktioniert nicht Drucken ivar
s.Warum? Dies liegt daran, dass das Merkmal zum Serialisieren hash-with-ivars
dem psych
Juwel in seinem version 2.0.9 hinzugefügt wurde. Das psych
Juwel ist jetzt ein Teil der Ruby Standardbibliothek und diese spezielle Version davon wurde added zur stdlib 2.3.0 preview1 Version.
So hat die mysteriös verschiedene Ausgabe eine einfache Erklärung: der Autor Autoras verwendet wahrscheinlich Ruby 2.2 oder früher beim Schreiben des Buches und diese Ruby-Version nicht angezeigt Instanzvariablen in der Hash
Debug-Ausgabe noch. Tatsächlich gibt es im Tutorial Hinweise, dass suggest der Autor Ruby 2.1.5 verwendet hat.
Ist @permitted einer Ihrer Instanzvariablen in static_pages # home? – kiddorails
Nein @permitted ist nicht in der Steuerung oder im HTML. Ich habe jede erstellte Datei überprüft und kann sie nicht finden. – DCR
@DCR gab es eine Lösung dafür? Ich denke daran, den gleichgültigen Zugang zu den Params zu versuchen, da ich keine Ideen mehr habe und keiner von 30+ dieser SO meine Frage beantwortet – Mirv