我的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 %>
为什么这对于第一个示例而不是第二个示例有用。
答案 0 :(得分:1)
我假设您已在application_controller中打开protect_from_forgery
。
我有一个类似的问题,其中Flash在#create
和#update
上运行正常,但在#destroy
上运行不正常。它与protect_from_forgery
有关,如果未验证请求(例如在非GET请求上缺少令牌),它将清除flash_hash。
您可以通过两种方式解决此问题:
link_to
标签生成<a>
而不是button_to
标签生成表格。 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
的更多信息很有帮助。