我在我的主页上使用自定义注册模式(使用设计),并且我使用闪存来存储错误并在自定义注册模式中显示它们。我想知道的是我是否可以使用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');
任何帮助将不胜感激
答案 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
标题的标题。