2009-08-26 10 views
5

Ho la sequenza di codice riportata di seguito in un'azione del controller di rotaie. Prima dell'IF, params contiene i parametri della richiesta, come previsto. Dopo di ciò, params è nullo. Qualcuno può spiegare cosa sta succedendo qui?assegna/sostituisce l'hash dei parametri nelle guide

if false 
    params = {:user => {:name => "user", :comment => 'comment'}} 
end 

Grazie.

risposta

10

Il params che contiene i parametri della richiesta è in realtà una chiamata al metodo che restituisce un hash contenente i parametri. La linea params = si assegna a una variabile locale denominata params.

Dopo il blocco if false, Ruby ha visto la variabile locale params in modo che quando si fa riferimento a params tardi nel metodo la variabile locale ha la precedenza sulla chiamata al metodo con lo stesso nome. Tuttavia, poiché l'assegnazione di params = si trova all'interno di un blocco if false, la variabile locale non viene mai assegnata a un valore, pertanto la variabile locale è nil.

Se si tenta di fare riferimento a una variabile locale prima di assegnare ad esso avrete una NameError:

irb(main):001:0> baz 
NameError: undefined local variable or method `baz' for main:Object 
     from (irb):1 

Tuttavia, se v'è un incarico alla variabile che non è nel percorso di esecuzione di codice poi Rubino ha creato la variabile locale ma il suo valore è nil.

irb(main):007:0> baz = "Example" if false 
=> nil 
irb(main):008:0> baz 
=> nil 
+0

"Ruby ha visto i parametri locali" davvero, Ruby ??? VERAMENTE!!!??? O_o (mi dispiace, ma mi è costato diversi giorni ... Vedere non è in esecuzione, vero?) – steffen

Problemi correlati