Flash pojawia się na właściwej, ale i kolejnej stronie

Zauważyłem dziwną rzecz w aplikacji. Weźmy za przykład kupowanie czegoś za punkty. Wybieram tą opcję, nie mając punktów, wyświetlam błąd:

flash[:error] = 'Nie masz wystarczającej ilości punktów.'

aplikacja przekierowuje na tą samą stronę, pojawia się flash z błędem. Następnie przechodzę na dowolną inną stronę i znów widzę flash z błędem. Dopiero po kolejnym przejściu znika. Dlaczego flash nie wyświetla się tylko za pierwszym razem?

użyj flash.now[:error] jak przekierowywujesz

Otóż nie. flash.now używa się wtedy gdy przekierowania się nie robi (http://www.gatezero.org/blog/2008/10/7/rails-flashnow.html ), zatem nie pasuje do tej sytuacji. Czy aby na pewno ustawiasz flash tylko raz i nie robisz tego drugi raz po przekierowaniu?

Tutaj szukałbym przyczyny. Może jednak ustawiasz po przekierowaniu na samą siebie nowego flasha?

[quote=radarek]Otóż nie. flash.now używa się wtedy gdy przekierowania się nie robi (http://www.gatezero.org/blog/2008/10/7/rails-flashnow.html ), zatem nie pasuje do tej sytuacji. Czy aby na pewno ustawiasz flash tylko raz i nie robisz tego drugi raz po przekierowaniu?

Tutaj szukałbym przyczyny. Może jednak ustawiasz po przekierowaniu na samą siebie nowego flasha?[/quote]
otóż tak…
tym bardziej, że wyraźnie stoi

nadal uważam, że tego szukał :slight_smile: może niefortunnie użyłem zasugerowanego słowa przekierowanie :slight_smile: Trudno to przekierowaniem nazwać…

pozdrawiam

Problem występuje tylko gdy flash pojawia się na tej samej stronie, która była poprzednio wyświetlona. Nie używam redirect, tylko po prostu zwyczajnej funkcji render. Tzn. po uzupełnieniu formularza, wyświetlana jest ta sama strona wraz z informacją we flash. Na pewno nie wywołuję flasha podwójnie.

Dzisiaj już padam, jutro sprawdzę co dokładnie robi flash.now i zbadam sprawę głębiej.

To proste. Ustawiasz flasha przed renderowaniem widoku. Potem renderowany widok odczytuje właśnie ustawioną wartość flasha i ją wyświetla. Flash ustawiony normalnie jest też zapamiętywany na później. Różnica między ustawieniem flash.now jest taka, że to też jest odczytywalne zaraz po ustawieniu, ale nie jest zapamiętywane dla następnego żądania.