是否可以检查javascript(rails)中是否存在flash消息

时间:2016-01-26 02:02:42

标签: javascript jquery ruby-on-rails devise

我在我的主页上使用自定义注册模式(使用设计),并且我使用闪存来存储错误并在自定义注册模式中显示它们。我想知道的是我是否可以使用javascript检查flash中是否有任何消息,如果是,我可以在重定向到主页时自动打开模态。因此,基本上我需要javascript来执行以下操作:

Are there messages stored using flash? 
If so, open modal when homepage loads. 

我可以在使用js加载主页时打开模态,但我无法确定如何检查闪存中是否有消息。是否可以访问闪存并检查是否存在使用js存储的错误?谢谢!

编辑:

所以我对AJAX来说是全新的,但我遵循了这一点:http://ashleyangell.com/2010/10/handling-rails-flash-message-with-ajax-requests/

我将以下内容添加到应用程序控制器中:

after_filter :flash_headers
def flash_headers
  return unless request.xhr?
  response.headers['x-flash'] = flash[:error]  unless flash[:error].blank?
  response.headers['x-flash'] = flash[:notice]  unless flash[:notice].blank?
  response.headers['x-flash'] = flash[:warning]  unless flash[:warning].blank?
  # Stops the flash appearing when you next refresh the page
  flash.discard
end

我有以下javascript:

$(document).load(function(){
$.ajax({ 
var flash = response.getHeader('x-flash');
if (flash) alert(flash);
     });
});

现在我得到了一个"意想不到的标识符"在下面一行显示问题,并且当有闪光通知时,警报不会显示。

var flash = response.getHeader('x-flash');

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

你的模式错了。

通过调用动作创建的"flash" is a session cookie。你的理论,你可以检查闪存消息"不会工作。它们只会在回应请求时提供:

  

闪存是会话的一个特殊部分,每次请求都会清除它。这意味着存储在那里的值只能在下一个请求中使用,这对于传递错误消息等非常有用。

这意味着您需要通过ajax发送模式的表单请求,以便解析返回的数据(无论x-flash标头是否存在):

#modal
<%= form_tag ... remote: true do %>

#app/assets/javascripts/application.js
$(document).on("ajax:success", "#new_user_form", function(data, status, xhr) {
    var flash = xhr.getHeader('x-flash');
    if (flash) alert(flash);
});

要正确理解这一点,您应该阅读stateless properties of HTTP

  

无状态协议的一个示例是HTTP,这意味着可以单独理解每个请求消息。

您需要的最重要的事情是flash.now

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
    after_filter :flash_headers, if: Proc.new {|c| c.request.xhr? }

    private 

    def flash_headers
       types = %i(error notice warning)
       types.each do |type|
          response.headers['x-flash'] = flash.now.send(type) unless flash.now[type].blank?
       end
   end
end

flash.now设置 请求的闪存(不作为默认新请求的一部分)。这将允许您通过ajax响应发回值(对HTTP来说,是同一个请求)。

在您的&#34;操作&#34;中设置消息时,请务必使用flash.now。控制器:

#app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
   def create
      flash.now[:notice] = "Success"
   end
end

答案 1 :(得分:0)

看起来你正在使用jQuery来进行AJAX调用。我认为你需要一些看起来像这样的JS

$(document).load(function(){
  $.ajax('/url/of/action')
    .done(function(data, textStatus, request){
      var flash = request.getResponseHeader('x-flash');
      if (flash) alert(flash);
     });
});

这将调用/url/of/action,并在完成后查看x-flash标题的标题。