2016-04-15 9 views
11

In Kapitel 7 kommt Ich bin mitrailstutorial wo Informationen debug aus

--- !ruby/hash-with-ivars:ActionController::Parameters 
elements: 
    controller: static_pages 
    action: home 
ivars: 
    :@permitted: false 

könnte jemand erklären, wo die Hash-mit-ivars die folgende Ausgabe bekommen herkommt und was ivars: : @permitted: falsch bedeutet?

+0

Ist @permitted einer Ihrer Instanzvariablen in static_pages # home? – kiddorails

+0

Nein @permitted ist nicht in der Steuerung oder im HTML. Ich habe jede erstellte Datei überprüft und kann sie nicht finden. – DCR

+0

@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

Antwort

19

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.

+0

das ist eine großartige Antwort, aber warum wird das Beispiel nicht ausgegeben aus dem Tutorial übereinstimmen? Ich habe mit dem Autor gesprochen und er kann nicht erklären, was vor sich geht. – DCR

+0

Bitte beachten Sie mein Update auf die Antwort :) – BoraMa

+1

Ich muss 8 Stunden warten, bevor Sie das Kopfgeld senden. Danke für Ihre Hilfe. – DCR

Verwandte Themen