Jawna deklaracja klasy modelu dla formularza

Cześć

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

możesz ustawiać w after_filterze coś w stylu:

@order ||= Order.new

ew. możesz wyświetlać formularz tylko, gdy order jest ustawiony.

chyba sobie poradziłem, napisałem tak:

<%= form_for @order, :url => orders_path, :as => Order do |f|%>

i niby leci do dobrej akcji. Czy działa, okaże się jak rozwiąże kolejną zagwozdke.

Może? <%= form_for @order || Order.new do |f| %> <% end %>

Fajny case dla decent_exposure:

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.

I wgl taki form to ja bym już do apotomo przerzucił. I wyczyści ci widoki i w razie potrzeby możesz łatwo prosto i przyjemnie rozbudować :wink:

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.

Ale do czego Ci to jest potrzebne? Czy nie słyszałeś nigdy, że zmienne globalne to jest w 99,9% niewłaściwy sposób rozwiązania problemu?

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”

Użyj redisa lub innego rozwiązania typu key-value store.

Wystarczy też zwykły plik yml :slight_smile:

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ć.

mógłby być pusty, zwykły semafor jest - nie ma