ruby-on-rails - Rails:CanCanCan - AccessDenied 错误未显示
问题描述
我在我的 rails 应用程序中使用 CanCanCan 进行授权。路由和重定向工作正常,但我无法显示 AccessDenied 错误消息(它以前工作过,但我一定是在路上搞砸了,现在它不会显示)。
这是我的代码:
控制器/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, error: exception.message
end
...
end
(我将默认设置更改:alert
为:error
,否则我最终会收到来自设计的警报('您已经登录')。
意见/index.html.haml(根)
= flash[:error] if flash[:error]
...
关于如何让它再次工作的任何想法?提前致谢。
- -编辑 - -
我尝试了更多修复(没有成功):
替换
error
为message
和notice
完全删除该
rescue_from CanCan::AccessDenied
方法 - 它把我带到了标准的 CanCan 错误页面(所以我知道该方法本身是有效的)。exception.message
用常规字符串替换。在重定向之前添加 puts 语句 - 它会按预期打印在控制台中。
正如@Anand Shah 在回答这个问题时所建议的那样,我在我的观点中添加了以下内容:
- 如果 flash[:error].blank?
%p flash hash 为空
哈希确实是空的,所以看起来闪存根本没有被保存。然后我加了
flash.keep(:错误)
在我的控制器中,但这并没有改变任何东西。
解决方案
这个问题的原因原来是我的routes.rb
。除了定义设计范围的根:
devise_scope :user do
root to: "devise/sessions#new"
end
authenticated :user do
root 'application#show', as: :authenticated_root
end
我还定义了一个额外的根(这基本上导致了双重重定向,因此丢失了警报):
root to: 'application#show'
文档中的代码在必要的修改后工作得很好(注意我可以把它从不破坏东西带回来error
)alert
:
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, alert: exception.message
end
推荐阅读
- c++ - 为什么在同一输入上调用 std::getline() n 次会提供第 n 个标记化?
- c++ - 带有指针的 C++ -Weffc++ 警告
- powershell - 如果找到匹配的子目录,则需要每个子目录的脚本来执行命令
- android - 如何在同一 recyclerview 的适配器类中更新 recyclerview?
- cordova - Cordova opentok 插件在发布到会话后失败
- java - Java - While Loop 不断重复披萨程序
- cmake - 如何正确设置 AlloSystem 及其所有依赖项?
- azure-devops - Microsoft Teams connector for Azure DevOps is not avaiable
- android - Android Camera2为什么旋转后旋转后我的预览比例会发生变化?
- java - 如何在启动时将 JVM 选项传递给 jshell