Interessante domanda! Ho cercato tutte le fonti di libreria di un progetto di rotaie per 'hash-with-ivars'
e solo un singolo luogo è stato pubblicato: lo psych
ruby library per (de-) serializzare oggetti arbitrari da e verso YAML. Specificamente, questi sono collegamenti al codice sorgente per reading e writing questa struttura YAML.
In Chapter 7 dell'esercitazione di Rails, questa uscita risulta come l'output del comando debug(params)
che viene richiesto di inserire un modello. Il comando debug
chiama apparentemente la libreria psych
per mostrare una rappresentazione leggibile dell'oggetto (params
in questo caso).
Ora, params
- la struttura universale Rails dati per contenere i parametri passati da URL o forme - è un oggetto che si comporta come un Hash
ma non è puro hash: è un'istanza della classe ActionController::Parameters
che è una sottoclasse di Hash
, vediamo il class definition:
module ActionController
# ...
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
end
end
mentre HashWithIndifferentAccess
è una sottoclasse diretta di Hash
.
Come una sottoclasse Hash
, l'oggetto params
può contenere altri dati oltre l'hash per sé e questo è ciò che psych
supporta in realtà quando si tenta di stampare l'oggetto in una forma leggibile. Oltre a stampare tutti gli elementi hash (sotto la chiave elements
), tenta di elencare anche tutte le variabili di istanza dell'oggetto e lo stampa sotto la chiave ivars
.
Quindi, tutto sommato, questa stampa di debug semplicemente dice che l'oggetto debug è un'istanza della classe ActionController::Parameters
, che è una sottoclasse di Hash
, che poi è elementi di hash ha anche una variabile @permitted
un'istanza definita ed è attualmente impostato su false
. I due elementi, a proposito, lo controller
e action
sono parametri utilizzati internamente da Rails per il routing.
Quando si guarda nella fonte della classe ancora una volta, sarete davvero trovare il @permitted
destra variabili nel costruttore:
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
Infine, dal documentation possiamo concludere che la variabile @permitted
mantiene lo stato di il permesso dei param. Cioè è impostato su true
dopo i params sono consentite utilizzando il metodo permit
:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
Aggiornamento: il motivo per cui l'output di debug del RailsTutorial differisce
L'output di debug alla RailsTutorial si differenzia un po '- non è così stampa ivar
s.Perché? È perché la funzione per serializzare hash-with-ivars
è stata aggiunta alla gemma psych
nel suo version 2.0.9. La gemma psych
è ora parte della libreria standard Ruby e questa particolare versione di è stata added nella versione 01.di stdlib preview1.
Così, il misteriosamente diversa uscita ha una spiegazione semplice: l'autore RailsTutorial più probabilmente usato rubino 2.2 o precedente durante la scrittura del libro e questa versione ruby non visualizzava variabili di istanza nell'output di debug Hash
ancora. In realtà, ci sono suggerimenti nel tutorial che suggest che l'autore ha utilizzato Ruby 2.1.5.
È @permitted una qualsiasi delle variabili di istanza in static_pages # home? – kiddorails
No @permitted non è nel controller o nel html. Ho controllato tutti i file che ho creato e non riesco a trovarlo. – DCR
@DCR c'era una soluzione per questo? Sto pensando di provare a fare l'accesso indifferente ai params dato che sono fuori di idee e nessuno dei 30+ di questi SO risponde alla mia domanda – Mirv