2010-03-15 19 views
33

Myślałem, że za każdym razem, gdy robisz flash[:notice]="Message", dodasz go do tablicy, która następnie zostanie wyświetlona podczas widoku, ale następująca po prostu utrzymuje ostatnią lampa błyskowa:Szyny: Łatwy sposób dodania więcej niż jednego błysku [: notice] w tym samym czasie

flash[:notice] = "Message 1" 
flash[:notice] = "Message 2" 

teraz zdaję sobie sprawę, że to tylko prosty skrótu z kluczem (chyba :)) ale czy istnieje lepszy sposób to zrobić kilka błysków niż następującym:

flash[:notice] = "Message 1<br />" 
flash[:notice] << "Message 2" 
+1

Uważaj na przepełnienie pliku cookie. – Ziggy

+0

@Ziggy TAK! Dziękuję Ci. Wpadłem na ten ostatni tydzień, więc twój czas jest asem. Skończyło się na przechodzeniu do magazynu sesji "ActiveRecord" w celu obsługi większych danych sesji, jak na: http://guides.rubyonrails.org/security.html#session-storage –

Odpowiedz

40

The wiadomości flash może naprawdę być wszystkim, co chcesz, możesz zrobić coś takiego:

flash[:notice] = ["Message 1"] 
flash[:notice] << "Message 2" 

A potem w swoich poglądów, wyjście jako

<%= flash[:notice].join("<br>") %> 

czy co wolisz.

To, czy ta technika jest łatwiejsza, niż inne rozwiązania, zależy od własnych preferencji.

+2

nie działa z szynami 3 ... – dStulle

+0

@dStulle jaki jest błąd? –

+1

W Rails 3 kod "
" zostanie usunięty, o ile nie zostanie oznaczony jako bezpieczny. Wypróbuj [safe_join] (http://apidock.com/rails/ActionView/Helpers/OutputSafetyHelper/safe_join): '<% = safe_join (flash [: notice],"
".html_safe)%>'. Należy również pamiętać, że poszczególne elementy flash są zwykle tylko ciągami. mipadi używa [kwadratowych nawiasów] wokół instancji, aby utworzyć tablicę zamiast tego. Bez tych nawiasów, '<<' po prostu dodaje więcej tekstu do ciągu znaków. –

56

I zazwyczaj dodać takie metody do mojego ApplicationHelper:

def flash_message(type, text) 
    flash[type] ||= [] 
    flash[type] << text 
end 

I

def render_flash 
    rendered = [] 
    flash.each do |type, messages| 
    messages.each do |m| 
     rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank? 
    end 
    end 
    rendered.join('<br/>') 
end 

I po to jest bardzo łatwe do korzystania z nich:

można napisać coś takiego:

flash_message :notice, 'text1' 
flash_message :notice, 'text2' 
flash_message :error, 'text3' 

w kontrolerze.

I tylko dodać tę linię do układu:

<%= render_flash %> 
+1

Dzięki Victor, to jest bardziej dokładna odpowiedź. Przypuszczam, że można to zrobić tak solidnie, jak potrzeba. Nadal jestem trochę zaskoczony, że to nie jest wbudowane w rdzeń - wydaje się oczywistym wymogiem (kiedy to piszę, mam trzy powiadomienia typu "flash" pochodzące z Stack Overflow (np. Nowa plakietka, powiązanie mojego konta itp.);) –

+3

Dobra odpowiedź. Istnieją jednak dwa problemy: metoda 'flash.now' oraz możliwość nadania wiadomości flash jako dodatkowy parametr w wywołaniu' redirect_to'. Pierwszą można obsłużyć, nadając metodzie "flash_message" trzeci (ewentualnie opcjonalny) parametr boolowski; jeśli "true" jest podane jako jego wartość, metoda powinna używać tablicy 'flash.now' zamiast' flash'. (Wystarczy jedna inicjalizacja do pustej tablicy). Drugi problem jest rozwiązywany po prostu przez ustawienie wiadomości flash w osobnej linii przed wywołaniem 'redirect_to' zamiast użycia dodatkowego parametru. –

+0

Użyłbym tego jako alternatywnej pierwszej linii flash_message, aby upewnić się, że jest to tablica. 'flash [type] = * flash [type]' –

3

Myślę, że pomysł zbudowany w ramy jest to, że każda wiadomość trzymać w pamięci flash jest zbyt zapisu. Każdą wiadomość nadajesz unikatowemu kluczowi, aby można ją było zmienić lub nadpisać.

Jeśli potrzebujesz inny komunikat, nie nazywaj go „: wypowiedzenia.” Nazwij każde coś wyjątkowym. Następnie, aby wyrenderować wiadomości flash, przeprowadź pętlę przez cokolwiek, co jest w haśle.

Jeśli to nie działa dla Ciebie, należy rozważyć, czy rzeczywiście trzeba uprościć UI.

2

Chociaż zgadzam się z tym, że Jonathan UI może potrzebować trochę uproszczenie, istnieją przypadki, w których może chcesz pokazać wiele wiadomości na ten sam klucz.

W rezultacie Stworzyłem klejnot, który (powinny) ułatwiają radzenia sobie z wieloma wiadomości flash, w tym samym kluczu i ich renderowania w widoku.

GitHub: flash-dance

1

On Rails 4.1 to nie będzie działać.Mam inną realizację, więc myślę, że Twój kod powinien zostać zmieniony w ten sposób:

def render_flash 
    rendered = [] 
    flash.keys do |type| 
    flash[type].each do |m| 
     rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank? 
    end 
    end 
    rendered.join('<br/>') 
end 
+2

Czy 'flash [nazwa]' przypuszczalnie ma postać 'flash [type]'? –

+0

Tak, dziękuję. – sekrett

0

Sposób, w jaki sposób używać zarówno „tradycyjne” wiadomości jedno-liner i tablicy stylu wiadomości z przerwami liniowych.

Z Rails 4.1 i serializatora JSON, można użyć wiadomości flash, jeden-liner

flash[:notice] = 'message' 

i wiadomości flash, kilka linii

błysk [: notice] = [ 'Linia komunikatów 1' 'linia wiadomość 2']

jak tak (w application.html.haml lub odpowiedni plik szablonu)

- if notice 
    #css_class 
    = safe_join(Array(notice), '<br/>'.html_safe) 
0

Jeśli chcesz dodać wiadomości flash do swojej aplikacji, wystarczy przepłynąć tymi krokami.

Dodaj plik _flash_messages.html.erb i dodaj do niego ten kod.

<% flash.each do |type, message| %> 
    <div class="alert <%= bootstrap_class_for(type) %> fade in"> 
    <button class="close" data-dismiss="alert">×</button> 
    <%= message %> 
    </div> 
<% end %> 

I teraz nazywają go w application.html.erb jak dodać tę linię w application.html.erb

<%= render partial: "shared/flash_messages", flash: flash %> 

teraz dodać ten kod w application.helper.rb

modułu ApplicationHelper

def bootstrap_class_for flash_type 
    case flash_type 
    when :success 
     "alert-success" 
    when :error 
     "alert-error" 
    when :alert 
     "alert-block" 
    when :notice 
     "alert-info" 
    else 
     flash_type.to_s 
    end 
end 

koniec

To zadziała dla Ciebie z nadzieją.

Powiązane problemy