Wenn Sie AJAX-Aufrufe verwenden möchten, sollte redirect_to nicht in der Steuerung verwendet werden. Flash-Nachrichten sollten vielmehr explizit bezeichnet werden:
In your_controller:
respond_to :js
def your_ajax_method
flash[:notice] = 'Your message!'
end
In der Ansicht, die von your_ajax_method_in_the_controller benannt wird
your_ajax_method_in_the_controller.js.haml
:plain
$("form[data-remote]")
.on("ajax:success", function(e, data, status, xhr) {
$('.messages').html("#{escape_javascript(render 'layouts/messages')}");
setTimeout(function(){ $(".alert").alert('close') }, 5000);
})
Bitte beachten Sie, dass die Nachrichtenklasse ein Ankerpunkt zum Rendern von Nachrichten ist. Diese Klasse sollte in Ihrer Ansicht oder Ihrem Anwendungslayout vorhanden sein. Wenn Sie ERB verwenden, wird die Linie$('.messages').html("<%= j(render 'layouts/messages') %>");
Das oben in HAML / ERB eingebettete JavaScript ist der Schlüssel zum Anzeigen von Flash-Nachrichten bei Verwendung von AJAX. Alle anderen Komponenten bleiben für Nicht-AJAX-Aufrufe gleich.
Sie können your_ajax_method_in_the_controller.js.coffee.js verwenden oder einfach, aber dann sind die Rails-Variablen für JS / Coffee nicht verfügbar. Obwohl ich hier keine Variablen verwende, ziehe ich es vor, JS in HAML zu verpacken, um eine konsistente Codebasis zu erhalten.
Ich nutze Twitter Bootstrap zum Stylen von Nachrichten, um $(".alert").alert('close')den Hinweis auszublenden. Und hier sind die Nachrichten teilweise:
Layouts / _messages.html.haml
- flash.each do |name, msg|
- if msg.is_a?(String)
.alert-messages
%div{class: "alert alert-#{name == :notice ? "success" : "error"} fade in"}
%a.close{"data-dismiss" => "alert"}
%i.icon-remove-circle
= content_tag :div, msg, id: "flash_#{name}"
Nur für den Fall, CSS für die Warnungen ist unten
.alert-messages {
position: fixed;
top: 37px;
left: 30%;
right: 30%;
z-index: 7000;
}
after_filter { flash.discard if request.xhr? }