ruby-on-rails - 我的闪光警报有时会消失,但并非总是如此
问题描述
我的 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 %>
为什么这适用于第一个示例而不是第二个示例。
解决方案
我假设你已经protect_from_forgery
在你的 application_controller 中打开了。
我有一个类似的问题,即 flash 可以正常工作#create
,#update
但不能正常工作#destroy
。protect_from_forgery
如果请求未经验证,例如在非 GET 请求中缺少令牌时,它与清除 flash_hash 有关。
您可以通过 2 种方式解决此问题:
- 通过表单发送删除请求,以便 Rails 注入正确的令牌。我的错误是使用生成的
link_to
标签而<a>
不是button_to
生成表单的标签。 - 例如,向 中添加一个条件,
protect_from_forgery
这样它就不会清除 flash_hashprotect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
。我在这里看到了这个解决方案。
我发现这篇文章有助于了解更多关于protect_from_forgery
.
推荐阅读
- java - ClassCastException class.Accomodation 不能转换为 class.Attraction
- asp.net-core - Web api中是否有请求订单?
- node.js - 如何在没有磁盘上实际文件的情况下在 PM2 中重新启动应用程序
- php - file_get_contents() 输出 HTTP 400 错误请求错误
- arduino - 适用于 ESP32 的 Max TX power 经典蓝牙
- google-cloud-platform - 谷歌云上用于 pihole 的 Icmp ping 和 dns 端口不起作用
- sql - SQL Count 和 distinct count(*) 通过对两列进行分组
- reactjs - 如何在reactjs中将数组显示为Jsx元素
- javascript - 为什么我在反应中得到第一个响应是一个空数组?
- google-cloud-platform - 验证 Google Cloud Platform 服务使用配额