Wyszukiwanie przez Stack Overflow już za kilka godzin, ale żadne z powiązanych pytań nie dotyczą mojego problemu.Dodatkowa zmienna instancji w kontrolerze jest zerowa w widoku?
Jestem nowy w Rails, ponieważ jest to mój pierwszy prawdziwy projekt i może trochę zagmatwać konfigurację MVC. Ja próbuje przypisać zmiennej instancji @stars natomiast w działaniu searches_controller.rb:
def create
@search = Search.new(params[:search])
tempstr = searchstr(@search)
@stars = Star.where("tempstr", :limit => 100)
end
@search
tworzony jest w porządku, jest poszukiwanie kompleks z różnymi parametrami. tempstr
to tylko prosty kontener łańcuchowy dla wyników searchstr(@search)
, który jest szybką metodą konwertowania parametrów wyszukiwania na odpowiedni ciąg MySql (co wydaje się łatwiejsze niż próba użycia w normalny sposób pomocnika .where w tym przypadku). Jestem pewien, że mogę po prostu wstawić searchstr(@search)
bezpośrednio do., Ale na razie dzielę je, aby móc sprawdzić elementy, które przechodzą.
W każdym razie pojawia się problem, gdy próbuję zadzwonić pod numer @stars
w widoku show.html.erb. Nawet z czymś tak prostym jak to:
<% @stars.each do |star| %>
<%= display stuff %>
<% end %>
Otrzymuję komunikat o błędzie z informacją: 'each' is not a method of nil:NilClass
. Tak, zmieniłem go na następujące kwestie, aby zobaczyć czy @stars była zerowa:
<%= @stars.inspect %>
Rzeczywiście, @stars
jest nil
. Jednak, kiedy dodać tę linię do mojego kontrolera, by sprawdzić @stars
tam:
return render @stars.each
widzę, że zmienna jest wypełniona gwiazdy poprawnych obiektów z Star.where(), tak jak zamierzał. Szybki .inspect pokazuje, że zmienna nie jest zerowa, gdy znajduje się w kontrolerze.
Nie jestem więc pewien, dlaczego widok jest odbierany jako zerowy, jeśli został zdefiniowany w kontrolerze. Nie zdziwiłbym się, gdyby to było nieporozumienie, jak działa MVC. Klasa Star została zdefiniowana w modelu Gwiezdne, ale może dlatego, że próbuję uzyskać do niej dostęp za pomocą kontrolera Wyszukiwania, a zatem nie jest ona inicjowana dla widoku?
Czy powinienem robić to w jakiś inny sposób? Próbowałem użyć zmiennej lokalnej (używając stars
zamiast @stars
), ale wtedy widok mówi "Niezdefiniowana zmienna lokalna lub metoda" gwiazdki "".
Każda pomoc byłaby bardzo doceniona, już rozwaliłem mój mózg przez wiele godzin, tworząc złożone wyszukiwanie i analizując dane z pliku gwiazdy w bazie danych, więc jestem trochę wypalony. Na życzenie mogę podać więcej informacji, nie jestem pewien, co jeszcze byłoby pomocne w udzieleniu odpowiedzi.
Cóż, na pewno nie chcesz <% = @ stars.each%>; czy to literówka? Również '' # {tempstr} "' gdy 'tempstr' jest już ciągiem jest trochę zbędne. Jeśli logujesz się lub 'podważasz' w kontrolerze, czy '@ gwiazdki' naprawdę zawiera wartości? –
@Dave Newton - Po pierwsze, dzięki za złapanie tempstr; Pierwotnie miałem zamiar zrobić. Gdzie z szynami składni, które wymagałyby oceny. W przypadku 2, wystąpił błąd literowy, a poprawię to w pytaniu, jeszcze raz dzięki. Dla 3, używając 'logger.debug' do wypisania '@stars.each do | star | star.ra end' (gdzie 'gwiazda.ra' jest jedną ze zmiennych gwiazdowych) wydaje się logować całą zawartość @stars, która zawiera wszystkie zmienne 2 gwiazd, które powinien znaleźć. Sądzę, że oznacza to, że zawiera wartości, choć może to być pobieranie z innego miejsca, jak sądzę? – Xadera