我在我的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
,否则我最终会收到来自设计的警告('您已登录')。
views / index.html.haml (root)
= flash[:error] if flash[:error]
...
有关如何让它再次运作的任何想法?提前谢谢。
--- --- EDIT
我尝试了一些其他修复(没有成功):
用error
和message
替换notice
完全删除rescue_from CanCan::AccessDenied
方法 - 它将我带到标准的CanCan错误页面(所以我知道方法本身正在运行)。
用常规字符串替换exception.message
。
在重定向之前添加一个puts语句 - 它会像预期的那样在控制台中打印出来。
正如@Anand Shah在回答question时建议的那样,我在观点中添加了以下内容:
- 如果flash [:error] .blank?
%p flash hash为空白
哈希确实是空的,所以看起来根本没有保存闪存。然后我添加了
flash.keep(:误差)
在我的控制器中,但没有改变任何东西。
答案 0 :(得分:0)
你是否通过私人浏览器尝试过,以防cookie搞砸了?
你可以尝试这种格式吗?
redirect_to(root_url, {:flash => { :error => exception.message }})
答案 1 :(得分:0)
您是否尝试过不处理此内联,而是使用以下内容:
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = exception.message
redirect_to root_url
end
之前工作的原因是Rails在:alert
期间将:notice
和redirect_to
理解为Flash消息,否则您应该使用&#34;通用flash
存储桶& #34;他们通过flash: {error: 'your message'}
但是传递给Hash
的{{1}}也可以包含http状态代码(redirect_to
)和网址查询参数(任何不是:status
的内容,{{1} },:alert
或:notice
这些只是看起来太多噪音(IMO),在那里放一条flash消息来保存一行显式代码。
答案 2 :(得分:0)
此问题的原因是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