2012-04-10 14 views
5

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.

+0

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

+0

@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

Odpowiedz

3

Ustawiasz @stars w metodzie create, ale widok, o którym mówisz, to show.html.erb. Spróbuj również ustawić @stars w metodzie show. Coś takiego:

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

Jeśli to nie pomoże, proszę pokazać, reszta z was kontrolera działania, więc możemy pomóc lepiej.

+0

Tak, masz absolutną rację! Właśnie sobie to wymyśliłem na długo przed opublikowaniem, ale bardzo dziękuję za odpowiedź i potwierdzenie! Początkowo myślałem, że strona Show automatycznie użyła metody Create podczas inicjalizacji, ale myliłem się. Taki prosty błąd sprawił, że spędziłem wiele godzin gotując mój mózg. – Xadera

+0

Ty pomógł mi rozwiązać całkowicie niezwiązany problem szyn. zasługujesz na górę: D – kubbing

Powiązane problemy