2012-04-10 6 views
5

Ho cercato attraverso Stack Overflow per alcune ore, ma nessuna delle domande correlate sembra essere applicabile al mio problema.La variabile di istanza aggiuntiva nel controller è nulla in vista?

Sono nuovo di Rails, essendo questo il mio primo vero progetto e potrei confondere un po 'il setup di MVC. Sto tentando di assegnare la variabile @stars esempio, mentre in un'azione del searches_controller.rb:

def create 
    @search = Search.new(params[:search]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

@search è creato bene, essendo una ricerca complessa con parametri variabili. tempstr è solo un semplice contenitore di stringhe per i risultati di searchstr(@search), che è un metodo rapido per convertire i parametri di ricerca in una stringa pertinente a MySql (che sembra essere più semplice che cercare di utilizzare normalmente l'helper .where, in questo caso). Sono sicuro di poter inserire lo searchstr(@search) direttamente nel file .where, ma li ho divisi per ora in modo da poter controllare gli elementi mentre passano.

Ad ogni modo, il problema si presenta quando provo a chiamare @stars nella vista show.html.erb. Anche con qualcosa di semplice come questo:

<% @stars.each do |star| %> 
    <%= display stuff %> 
<% end %> 

ottengo un errore che dice 'each' is not a method of nil:NilClass. Così, ho cambiato al seguente per vedere se @stars era pari a zero: abbastanza

<%= @stars.inspect %> 

Certo, @stars è nil. Tuttavia, quando aggiungo questa linea al mio controller per controllare @stars lì:

return render @stars.each 

vedo che la variabile viene riempita con gli oggetti corretti stelle dalla Star.where(), proprio come avevo previsto. Un rapido .ispect mostra che la variabile non è nulla, quando si trova nel controller.

Quindi, non sono sicuro del motivo per cui la vista lo riceve come zero se è stato definito nel controller correttamente. Non sarei sorpreso se fosse me a fraintendere come funziona MVC, però. La classe Star è stata definita nel modello Star, ma forse è perché sto tentando di accedervi dal controller di Ricerche e quindi non è inizializzata per la vista?

Devo andare in un altro modo? Ho tentato di utilizzare una variabile locale (utilizzando stars anziché @stars), ma la visualizzazione dice "Variabile locale non definita o metodo 'stelle'".

Qualsiasi aiuto sarebbe molto apprezzato, ho già distrutto il mio cervello per ore creando la ricerca complessa e analizzando i dati del file stellare nel database, quindi sono un po 'bruciato. Posso fornire ulteriori informazioni se richiesto, non sono sicuro di quale altro sarebbe utile nel fornire una risposta.

+0

Beh, di certo non vuoi <% = @ stars.each%>; è un errore? Inoltre, '" # {tempstr} "' quando 'tempstr' è già una stringa è un po 'ridondante. Se esegui il log o "fai leva" nel controller, '@ stars' contiene davvero dei valori? –

+0

@Dave Newton - Per esempio, grazie per aver catturato tempstr; Originariamente intendevo fare la sintassi .where con rails, che avrebbe avuto bisogno della valutazione. Per 2, il = in c'era un errore di battitura, e lo aggiusterò nella domanda, grazie ancora. Per 3, usando 'logger.debug' per produrre '@stars.each do | star | star.ra end' (dove 'star.ra' è una delle variabili stellari) sembra aver registrato l'intero contenuto di @stars, che include tutte le variabili di 2 stelle che il .where dovrebbe trovare. Penso che questo significhi che contenga dei valori, anche se potrebbe essere preso da qualche altra parte, suppongo? – Xadera

risposta

3

Si sta impostando @stars nel metodo create, ma la vista di cui si sta parlando è show.html.erb. Prova a impostare @stars nel metodo show. Qualcosa di simile a questo:

def show 
    @search = Search.find(params[:id]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

Se questo non ti aiuta, si prega di mostrare il resto di voi controllore azioni, in modo che possiamo aiutarti meglio.

+0

Sì, eri assolutamente corretto! L'avevo appena capito da poco non hai postato, ma grazie mille per aver risposto e confermato! Inizialmente avevo pensato che la pagina Show usasse automaticamente il metodo Create durante l'inizializzazione da lì, ma mi sbagliavo. Un errore così semplice mi ha fatto passare ore a cucinare il cervello. – Xadera

+0

la tua risposta mi ha aiutato a risolvere il problema delle rotaie totalmente non correlate. ti meriti tutto: D – kubbing

Problemi correlati