通过AJAX成功更新触发闪存通知 - Ruby on Rails

时间:2014-09-02 07:26:52

标签: jquery ruby-on-rails ajax

我希望在成功进行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%>

2 个答案:

答案 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

我希望它有所帮助

干杯