Якщо ви хочете використовувати виклики AJAX, redirect_to не слід використовувати в контролері. Швидше, флеш-повідомлення слід чітко позначати:
У вашому_контролері:
respond_to :js
def your_ajax_method
flash[:notice] = 'Your message!'
end
У поданні, яке іменовано вашим_аякс_методом_в_контролері
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);
})
Зверніть увагу, що клас повідомлень є опорною точкою для відтворення повідомлень. Цей клас повинен бути присутнім у вашому поданні або макеті програми. Якщо ви використовуєте ERB, рядок стає$('.messages').html("<%= j(render 'layouts/messages') %>");
Вищезазначений JavaScript, вбудований у HAML / ERB, є ключем до відображення флеш-повідомлень під час використання AJAX. Усі інші компоненти залишаються незмінними для дзвінків, що не стосуються AJAX.
Ви можете використовувати your_ajax_method_in_the_controller.js.coffee
звичайний .js, але тоді змінні rails будуть недоступні для JS / Coffee. Незважаючи на те, що я не використовую тут змінні, я волію обертати JS у HAML, щоб зберегти послідовну базу коду.
Я використовую Twitter Bootstrap для стилізації повідомлень, тим самим $(".alert").alert('close')
згасаючи повідомлення. І ось повідомлення часткові:
макети / _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}"
Про всяк випадок CSS для попереджень знаходиться нижче
.alert-messages {
position: fixed;
top: 37px;
left: 30%;
right: 30%;
z-index: 7000;
}
after_filter { flash.discard if request.xhr? }