Mam taki problem, w mojej aplikacji na każdej stronie jest renderowany partial (ten sam) w którym jest prosty formularz.
Problem w tym że jeżeli użyję prostego
<%= form_for (@order) do |f|%>
<%end%>
to wtedy próbuje odgadnąć klase tego modelu na podstawie zmiennej @order, jednak wiadomo że nie jest ona zdefiniowana dla każdej akcji, każdego kontrolera - a więc strona się wywala we wszystkich akcjach gdzie jej nie ma.
Jak to obejść?
Da się jawnie pokazać gdzie ma to wysyłać?
class OrderController
expose(:order)
end
Jeśli defaulty Ci nie pasują to zawsze możesz sobie ładnie samemu zdefiniować zachowanie. Dla wstacznej zgodności może coś w stylu :
class OrderController
expose(:order) { @order || Order.new }
end
I na widokach używać order zamiast @order.
Oczywiście można tak jak inni polecili wrzucić:
@order || Order.new
do widoku ale moim zdaniem one wtedy już nie są tak głupie jak powinny.
Okej, dzięki za odpowiedzi! Problem rozwiązane, ale znowu trafiłem na inny, z innej beczki.
Czy możliwe jest zdefiniowanie zmiennej globalnej? Właściwie to wystarczy mi w jednym kontrolerze, ale uwaga, potrzebuje żeby każda sesja mogła odczytać tą samą wartość.
próbowałem zdefiniować taką w application_controller, ale jej wartosc jest resetowana np przy kazdym odświeżeniu.
Do aplikacji użytkownicy wchodzą pod jakąś nazwą, wpisywaną na początku (potem czytana z cookiesów), tyle że 1 użytkownik musi wziąć pewną odpowiedzialność, taki sobie jakby “lider”.
Ale może być tylko jeden.
Jako że użytkownicy nie są zapisywani w żadnej bazie, dobrze by było żeby aplikacja miała w pamięci informacje ze “lider już istnieje”
Tak, przy założeniu, że chcesz mieć jednego lidera… lub więcej, ze względu na:
hazard
rozproszenie aplikacji na kilku serwerach
Warto też pomyśleć o wydajności - wymuszony dostęp do dysku, przy każdym requeście.
Nie mówię, że nie można wykorzystać pliku yaml, ale jest to rozwiązanie nieskalowalne. BTW - zwykły plik też da radę - wystarczy sprawdzać, czy istnieje.
Otoż to, także tez zrobiłem, zwykły plik gdzie jest zapisany 1 bajt.
Na szczęscie aplikacja nie będzie pracować pod dużym obciążeniem - więc tak może zostać.