我希望在成功进行AJAX更新后显示Flash成功通知,通常我会通过操作显示Flash通知,
def something
redirect_to "that_controller_path", :notice => "Success"
end
但我不知道如何在AJAX成功调用中执行此操作,我的AJAX调用是,
$.ajax(
{
type: "POST",
url: path,
data: response1,
contentType: "application/json",
success: ->
window.location.replace(window.location.protocol + "//" +
window.location.host + "/configuration/manage_users")
#Something here!
});
Flash通知在我的应用程序视图中,
<%if flash[:notice]%>
<div class="flash_notice">
<%=flash[:notice]%><br>
</div><!-- close -->
<%end%>
答案 0 :(得分:0)
<强>的Ajax 强>
首先,我需要解释一下,您无法通过“标准”Ajax流传递标准flash
功能。原因是作为flash
is set in a session cookie
,您只能通过浏览器刷新访问这些:
闪存是会话的一个特殊部分,每个部分都会被清除 请求。这意味着存储在那里的值只能在 下一个请求,对于传递错误消息等很有用。
您需要确保在发送/接收ajax时,为了设置flash
消息,您必须以不同的方式迎合它们;通过ajax
调用本身,或通过其他方法。
-
<强>接头强>
不可否认,我以前从未这样做过,但是看看这个答案表明你可以在你的ajax电话中set the headers:
#app/controllers/your_controller.rb
class YourController < ApplicationController
after_action :flash_headers
def flash_headers
return unless request.xhr?
response.headers['X-Message'] = flash_message
response.headers["X-Message-Type"] = flash_type.to_s
flash.discard # don't want the flash to appear when you reload page
end
private
def flash_message
[:error, :warning, :notice, nil].each do |type|
return "" if type.nil?
return flash[type] unless flash[type].blank?
end
end
def flash_type
[:error, :warning, :notice, nil].each do |type|
return "" if type.nil?
return type unless flash[type].blank?
end
end
end
我从这个答案中解除了代码:How do you handle Rail's flash with Ajax requests?
这会设置您的请求的标题,允许您通过JS提取此数据:
#app/assets/javascripts/application.js.coffee
$(document).on "click", "a", ->
$.ajax
type: "POST",
url: path,
data: response1,
contentType: "application/json",
success: (data) ->
msg = request.getResponseHeader('X-Message')
type = request.getResponseHeader('X-Message-Type')
alert msg #should alert the flash message
如果这样可行,它将为您提供设置和放置的能力。根据需要显示flash
条消息
答案 1 :(得分:0)
就我而言,我正在使用gritter来显示不错的通知。
所以在我的application.html.erb中,我的收益率是:
<div id="flash">
<%= render partial: "shared/notice_banner" %>
</div>
在那部分我有:
<% flash.each do |key, message| %>
<%= js add_gritter(message, :title => key.titleize, sticky: false, time: 3000, :image => key) %>
<% end %>
在我的控制器中:
flash.now[:notice] = "Movie has been deleted."
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
最后在我的method.js.erb中:
$("#flash").html('<%= j render partial: "shared/notice_banner" %>')
您可以在此处查看完整代码:
https://github.com/cristofer/moviedb
我希望它有所帮助
干杯