首页 > 解决方案 > 我的闪光警报有时会消失,但并非总是如此

问题描述

我的 Flash 消息有时会按预期消失,有时不会。

这是一个闪存消息工作的示例(控制器)

  def create
    user = User.find_by_email(params[:email])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_url, alert: "Logged in!"
    else
      flash.now[:alert] = "Email or password is invalid"
      render "new"
    end
  end

这是闪光警报未消失的示例

  def destroy
    session[:user_id] = nil
    redirect_to root_url, alert: "Logged out!"
  end

这是jQuery函数

jQuery(document).ready(function(){
  setTimeout(function(){
    $('#notice_wrapper').fadeOut("slow", function() {
      $(this).remove();
    })
  }, 3500);
});

这是包装器的 html/css/erb

<% if notice %>
    <div id="notice_wrapper" style="position: absolute; top: 0; width: 100%; z-index: 999; background: rgba(135, 216, 211, 0.85);">
      <p class="notice"><%= notice %></p>
    </div>  
  <% elsif alert%>
    <div id="notice_wrapper" style="padding: 2.5rem 0; text-align: center; margin: 0; font-size: 1.25rem; font-weight: 700; color: white; letter-spacing: 1px;">
      <p class="alert"><%= alert %></p>
    </div>
<% end %>

为什么这适用于第一个示例而不是第二个示例。

标签: ruby-on-rails

解决方案


我假设你已经protect_from_forgery在你的 application_controller 中打开了。

我有一个类似的问题,即 flash 可以正常工作#create#update但不能正常工作#destroyprotect_from_forgery如果请求未经验证,例如在非 GET 请求中缺少令牌时,它与清除 flash_hash 有关。

您可以通过 2 种方式解决此问题:

  1. 通过表单发送删除请求,以便 Rails 注入正确的令牌。我的错误是使用生成的link_to标签而<a>不是button_to生成表单的标签。
  2. 例如,向 中添加一个条件,protect_from_forgery这样它就不会清除 flash_hash protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }。我在这里看到了这个解决方案。

我发现这篇文章有助于了解更多关于protect_from_forgery.


推荐阅读