【问题标题】:Is it possible to check if flash message exists in javascript (rails)是否可以检查 javascript (rails) 中是否存在 Flash 消息
【发布时间】:2016-01-26 02:02:41
【问题描述】:

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

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

当主页使用js加载时,我已经可以打开模式,但是我不知道如何检查flash中是否有消息。是否可以访问flash并检查是否有使用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');

任何帮助将不胜感激

【问题讨论】:

  • 为此发出 ajax 请求。基于响应的打开模态
  • 那会是什么样子?
  • google 搜索不难。查找教程宝石等不会有任何问题
  • 为什么使用 ajax 而不是普通的 javascript?我仍然无法弄清楚您如何将 flash 视为 js/ajax 变量...
  • javscript 在浏览器中运行,您的闪存在服务器上。 ajax 是通过 javascript 向服务器发出请求和服务器响应数据来完成的

标签: javascript jquery ruby-on-rails devise


【解决方案1】:

你的模式是错误的。

"flash" is a session cookie 通过调用动作创建。您可以“检查闪存消息”的理论是行不通的。它们只会在响应请求时交付:

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

这意味着您需要通过 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.nowthat 请求设置闪存(默认情况下不作为新请求的一部分)。这将允许您通过您的 ajax 响应将值发送回(对于 HTTP,这是相同的请求)。

记得在“动作”控制器中设置消息时使用flash.now

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

【讨论】:

    【解决方案2】:

    看起来您正在使用 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 标头的标头。

    【讨论】:

    • 嗯,我也无法让它工作。我不想调用另一个 url,我只想要创建文档的原始 url 中的标题
    • @chris 您必须弄清楚那里的原始 url 和 JS 是什么。除非通过原始请求,否则无法获取标头。
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2018-09-12
    • 2014-06-18
    • 2018-07-28
    • 2017-02-16
    • 2021-12-03
    • 2023-04-08
    相关资源
    最近更新 更多