首页 > 解决方案 > 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]
...

关于如何让它再次工作的任何想法?提前致谢。

- -编辑 - -

我尝试了更多修复(没有成功):

- 如果 flash[:error].blank?
%p flash hash 为空

哈希确实是空的,所以看起来闪存根本没有被保存。然后我加了

flash.keep(:错误)

在我的控制器中,但这并没有改变任何东西。

标签: ruby-on-railsrubyerror-handlingcancancancancan

解决方案


这个问题的原因原来是我的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'

文档中的代码在必要的修改后工作得很好(注意我可以把它从不破坏东西带回来erroralert

rescue_from CanCan::AccessDenied do |exception|
  redirect_to root_url, alert: exception.message
end

推荐阅读