Problem z layoutem

Witam
Piszę sobie taką małą aplikację(sklep internetoey) na bazie Agille i utknąłem przy zakładaniu konta użytkownika. Wszystko osobno działa ok, ale jak dodam akcję do layoutu sklepu to dostaję komunikat

[code]NoMethodError in Login#add_user
Showing app/views/layouts/store.rhtml where line #21 raised:

You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.items

Extracted source (around line #21):

18:


19:

20: <%= hidden_div_if(@cart.items.empty?, :id => “cart”) %>
21: <%= render(:partial => “cart”, :object => @cart) %>
22:

23:
24: <%= link_to ‘Strona główna’, :action => ‘index’ %>
[/code]
Poza dodaniem wpisu
 layout 'store';

nic nie modyfikowałem.
Jak wpiszę adres akcji kontrolera to dostaję też to samo.

Prawdopodobnie błąd jest w szablonie częściowym, gdzie pewnie odwołałeś się gdzieś do @cart i nie sprawdziłeś tam czy nie jest pusty, a samo sprawdzenie w metodzie hidden_div_if nie wystarczy bo ono jedynie ukrywa div’a, który mimo to sie wykonuje,… tak więc sprawdź czy w szablonie częściowym masz coś takiego:

<% unless cart.items.empty? %> ... ... szablon ... <% end %>

Kwestia jest tego typu, że całła obsługa koszyka działa ok, dopóty nie dodam kontrolera login do layoutu store. Oba osobno działają bez zarzutów, A jeden z drugim nie mają nic wspólnego tylko chciałem żeby miały taki sam layout.

Przede wszystkim pisz proszę po Polsku. Nie świadczy o Tobie zbyt dobrze jeśli piszesz “utknołem”, “kwestja”. Sposób opisu problemu też pozostawia wiele do życzenia. Tylko po kodzie jestem w stanie domyślić się w czym problem (bo nie wiem np. co to znaczy “dodać akcję do layoutu”).

Tak jak Athril zasugerował błąd jest przy odwołaniu “obiekt.items” gdzie obiekt = nil. Błąd jest w partialu cart (plik _cart.*). Spróbuj w nim umieścić wywołanie <%= debug(@cart) %> i zobaczysz czy obiekt jest poprawnie widoczny w szablonie.

Co do samego podpinania layoutu. Layout ma prawo nie działać ot tak. Jeśli Twój obiekt @cart jest tworzony w filtrze, to musiałbyś także dodać do tego nowego kontrolera.

Macie racje. Problem tkwi gdzieś w obiekcie cart.

W kontrolerze store jest filter

before_filter :find_cart, except => empty_cart

find_cart jest metodą prywatną w kontrolerze store

def find_cart @cart = session[:cart] ||= Cart.new end
W kontrolerze “login” natomiast nie ma żadnego odwołania do tej metody. Jak dam filter do “ApplicationController” to też nic nie daje bo dalej mi woła, że nie może znaleźć metody “find_cart” w kontrolerze login.

undefined method `find_cart' for #<LoginController:0x10103a8>

No to skoro metoda find_cart ma być widoczna zarówno w klasach LoginController i StoreController (a obie dziedziczą po ApplicationController) to co trzeba zrobić? Przerzuć metodę find_cart do ApplicationController.

Przeniosłem metody find_cart i empty_cart do ApplicationController.

Dostaję kolejny komunikat o błędzie. Tym razm nie widzi widoku _cart, który jest w views/store

[code]ActionView::ActionViewError in Login#add_user
Showing app/views/layouts/store.rhtml where line #22 raised:

No rhtml, rxml, rjs or delegate template found for login/_cart in D:/Dyplom/sklep/app/views

Extracted source (around line #22):

19:


20: <%= hidden_div_if(@cart.items.empty?, :id => “cart”) %>
21: <%= render(:partial => “cart”, :object => @cart) %>
22:

23:
24: <%= link_to ‘Strona główna’, :action => ‘index’ %>

25: <%= link_to ‘Załóż konto’, :controller => :login, :action => ‘add_user’ %>[/code]
Jak tak dalej pójdzie to niedługo będę musiał przenieść wszystko

Jeszcze przyszła mi taka myśl do głowy, że może zamiast osobnego kontrolera login, zrobić wszystko w store? Nie wiem czy nie będzie trochę zamieszania z tym, ale przynajmniej powinno wszystko działać.

Słuchaj, ja Ci mogę pomóc bo lubię to robić. Ale będziemy tak bez końca. To o co pytasz to podstawy. Weź książkę do ręki, czytaj i ucz się. Inaczej szkoda mojego (czy też innych forumowiczów) i Twojego czasu.

Wszystko z layoutem już działa tak jak chciałem. Dzięki za wszelkie uwagi.

Mam teraz taki problem.
Mam dwie tabele users i orders. W tabeli orders jest user_id. W modelach mam zdefiniowane relacje. Przed złożeniem zamówienia użytkownik musi się zalogować i dane przechowywane są w sesji.
W jaku sposób mam pobrać user_id z sesji i wstawić go do tabeli orders?

Pobierasz z sesji tak jak wstawiłeś, tj. używając tego samego klucza do tablicy session.