2016-04-15 12 views
11

Nel capitolo 7 sto ottenendo il seguente output conrailstutorial dove sono le informazioni di debug provenienti da

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

qualcuno potrebbe spiegare dove l'hash-con-Ivars proviene e cosa Ivars: : @permitted: mezzi falsi?

+0

È @permitted una qualsiasi delle variabili di istanza in static_pages # home? – kiddorails

+0

No @permitted non è nel controller o nel html. Ho controllato tutti i file che ho creato e non riesco a trovarlo. – DCR

+0

@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

risposta

19

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.

+0

questa è un'ottima risposta, ma perché non l'output di esempio dalla partita del tutorial? Ho parlato con l'autore e lui non può spiegare cosa sta succedendo. – DCR

+0

Si prega di consultare il mio aggiornamento alla risposta :) – BoraMa

+1

Ho bisogno di aspettare 8 ore prima di inviarti la taglia. Grazie per l'aiuto. – DCR

Problemi correlati