我的闪光警报有时会消失,但并非一直消失

时间:2019-03-06 18:53:58

标签: ruby-on-rails

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

这是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 %>

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

1 个答案:

答案 0 :(得分:1)

我假设您已在application_controller中打开protect_from_forgery

我有一个类似的问题,其中Flash在#create#update上运行正常,但在#destroy上运行不正常。它与protect_from_forgery有关,如果未验证请求(例如在非GET请求上缺少令牌),它将清除flash_hash。

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

  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' }。我看到了这个解决方案here

我发现this的文章对获取有关protect_from_forgery的更多信息很有帮助。