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.
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? –
@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