Ich führe eine Ausnahmebehandlung in meinem Controller durch. Wenn eine Ausnahme ausgelöst wird: Aktion erstellen, werde ich in die Aktion: Neue Aktion rendern und eine Flash-Nachricht anzeigen.
Alles funktioniert einwandfrei, ich kann die Flash-Nachricht sehen, wenn eine Ausnahme abgefangen wird, aber wenn ich auf eine andere Seite umleitung (mit der Hand klicken) , ist die Flash-Nachricht immer noch hier . Dann leite ich auf eine andere Seite um ( der zweite Klick) , die Nachricht könnte verschwinden.
Wer weiß was der Grund ist?
Mein Controller-Code:
class MessagesController < ApplicationController
rescue_from Exception, :with => :render_new
def new
end
def create
end
private
def render_new
flash[:alert] = t("uploading_error")
render :action => :new
end
end
Mein Layoutcode (Haml):
%body
#content
- unless flash[:alert].blank?
#alert= flash[:alert]
quelle
Die Entscheidung zwischen flash.now und normalem Flash ist ein Schmerz im Arsch und meiner Erfahrung nach ziemlich zerbrechlich. Ich verwende einen normalen Blitz und ändere dann meinen Teil, der die Blitze anzeigt, um den Inhalt jedes Blitzes zu löschen, nachdem der Benutzer ihn gesehen hat. Ich denke das ist besser weil
a) Sie müssen nicht darüber nachdenken
b) "Hat der Benutzer es gesehen?" (dh "Wurden die Blitze teilweise gerendert?") ist das beste Kriterium für die Entscheidung, ob der Blitz gelöscht werden soll oder nicht, und keine Logik in Ihrer App.
Mein Flash-Teil sieht so aus - ich benutze auch ein bisschen jquery, um die Blitze hervorzuheben (dh sie für eine Sekunde gelb blinken zu lassen):
<div id="flashes"> <% if flash[:notice] %> <p id="flash_notice" class="messages notice"><%= flash[:notice] %></p> <%= javascript_tag "$('#flash_notice').effect('highlight',{},1000);" %> <% end %> <% if flash[:error] || flash[:errors] %> <p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p> <%= javascript_tag "$('#flash_errors').effect('highlight',{},1000);" %> <% end %> <% flash[:error] = flash[:errors] = flash[:notice] = nil %> </div>
quelle
Eine Alternative ist die Verwendung von flash.clear am Ende des Teils wie folgt :
<% if !flash.empty? %> <div class="flash-messages-container"> <% flash.each do |name, msg| %> <% if msg.is_a?(String) && [:success, :info, :error, :warning].include?(name) %> <div class="flash-message" data-type="<%= name %>" > <%= msg %> </div> <% end %> <% end %> </div> <% flash.clear %> <% end %>
quelle
Ich schlage auch vor, die
flash
inneren Hashes beim Anzeigen zu löschen .flash.clear
wird den Trick auf saubere Weise tun:<% flash.each do |key, value| %> <div class="alert alert-<%= key %>"> <%= value %> </div> <% end %> <% flash.clear %> #this line clears the object
http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html#method-i-clear
quelle
Auch dies funktioniert nicht ...... Bestimmte Arten von Ausnahmen wie Syntaxfehler ... verhindern, dass Cookies, Flashs oder Parameter vom Controller zur Ansicht übertragen werden. Sie können nur einen Sitzungsschlüssel verwenden und ihn nach Anzeige des Fehlers löschen.
Versuchen Sie Ihre Lösung mit einem Syntaxfehler ... Sie sollten sehen, dass Ihre Nachricht auf der umgeleiteten Seite nur mit einem Sitzungsschlüssel angezeigt wird.
quelle
Früher hatte ich das gleiche Problem, aber jetzt dadurch gelöst:
Versuchen Sie dies in Ihrem Code
<script type="text/javascript"> $(document).ready(function(){ setTimeout(function(){ $('#flash').fadeOut(); }, 2000); }) </script>
quelle