如果您想使用 AJAX 调用,则不应在控制器中使用 redirect_to。相反,应该明确表示 flash 消息:
在 your_controller 中:
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);
})
请注意,messages 类是呈现消息的锚点。此类应出现在您的视图或应用程序布局中。如果您使用 ERB,则该行变为 $('.messages').html("<%= j(render 'layouts/messages') %>");
上述嵌入到 HAML/ERB 中的 JavaScript 是使用 AJAX 时显示 flash 消息的关键。对于非 AJAX 调用,所有其他组件保持不变。
您可以使用your_ajax_method_in_the_controller.js.coffee 或普通的.js,但这样rails 变量将无法用于JS/Coffee。尽管我在这里不使用变量,但我更喜欢将 JS 包装在 HAML 中以保持代码库的一致性。
我利用 Twitter Bootstrap 来设置消息样式,因此 $(".alert").alert('close') 会淡化通知。这是 messages 部分:
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}"
以防万一,警报的 CSS 如下
.alert-messages {
position: fixed;
top: 37px;
left: 30%;
right: 30%;
z-index: 7000;
}