Если вы хотите использовать вызовы AJAX, redirect_to не должен использоваться в контроллере. Скорее, флэш-сообщение должно быть явно обозначено:
В вашем контроллере:
respond_to :js
def your_ajax_method
flash[:notice] = 'Your message!'
end
В представлении, названном your_ajax_method_in_the_controller
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;
}