2011-08-27 16 views
5

Come newbie Ruby on Rails, capisco che i riferimenti "@" e ":" hanno significati diversi. Ho visto this post in SO, che ha descritto alcune delle differenze.Ruby - Differenza tra: variabile e @variabile

  1. @ indica una variabile di istanza (ad esempio, @my_selection)
  2. : indica un alias (ad esempio,: my_selection)

mi sono imbattuto in una situazione in cui ho avuto uno standard Pagina MVC, simile a tutte le altre forme/pagine nella mia webapp.

html.erb snippet

<%= form_for @my_selection do |f| %> 

route.rb snippet

resources :my_selections 

Quando tento di accedere a questa pagina, ottengo questo errore:

NoMethodError in selections#create 
Showing C:/somedir/myapp/app/views/my_selections/index.html.erb where line #16 raised: 
undefined method `my_selection_index_path' for #<#<Class:0x1197e5676>:0x25439c3b> 

La riga 16 mostra lo snippet di forma n sopra.

Tutti i miei altri moduli/pagine nella stessa app Web sono impostati esattamente nello stesso modo e funzionano correttamente. Tuttavia, una volta modificato il riferimento del modulo erb a : my_selection, questo errore è andato via e la mia pagina si è comportata normalmente.

Domande:

  1. è la mia comprensione della differenza tra: my_selections e @my_selections corrette?
  2. Perché passare a: my_selection risolvere il mio errore originale?

risposta

13

Is my understanding of the difference between :my_selections and @my_selections correct?

No :(

: indica un simbolo, il suo non è un alias per qualsiasi cosa intrinseca. E 'come una stringa immutabile, che viene spesso usato come un nome per rappresentare qualcosa.

Nei luoghi in cui Rails api accetta un simbolo al posto di una variabile di istanza, internamente sta effettivamente facendo questo:

self.instance_variable_get "@#{my_symbol}" 

Che restituisce effettivamente il valore della variabile di istanza richiesta.

Quindi l'unica ragione per cui pensi che il simbolo corrisponda a una variabile di istanza è perché il codice che guida l'API che stai utilizzando funziona in questo modo. Senza una struttura per farlo per te, non esiste alcuna correlazione.

Why would switching to :my_selection resolve my original error?

for_form(model_instance) genererà un modulo che invia all'azione creare se l'istanza modello è salvato, o per l'azione di aggiornamento se il modello è già uscendo nel vostro DB.

No Non so cosa ci sia in @my_selection, ma qualunque classe sia non sembra che stia generando correttamente i percorsi.

resources :my_selections 

genererà un percorso che si richiamare in questo modo:

my_selections_path 

Come il modulo sta generando un percorso per my_selection_index_path non sono sicuro e tutto dipende da ciò che i vostri modelli sono.

E quando si passa invece un simbolo e non c'è alcun ivar corrispondente, esso viene utilizzato come nome del modello per la generazione della rotta. Quale farebbe la cosa giusta cercando di invocare my_selections_path, che è direttamente basato sul simbolo che si passa.

+0

Dovrò controllare cosa sta facendo il mio modello, ma apprezzo sicuramente la spiegazione. – JW8

Problemi correlati