Rails:CanCanCan - AccessDenied错误未显示

时间:2018-05-31 08:00:24

标签: ruby-on-rails ruby error-handling cancan cancancan

我在我的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

我尝试了一些其他修复(没有成功):

  • errormessage替换notice

  • 完全删除rescue_from CanCan::AccessDenied方法 - 它将我带到标准的CanCan错误页面(所以我知道方法本身正在运行)。

  • 用常规字符串替换exception.message

  • 在重定向之前添加一个puts语句 - 它会像预期的那样在控制台中打印出来。

  • 正如@Anand Shah在回答question时建议的那样,我在观点中添加了以下内容:

  

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

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

  

flash.keep(:误差)

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

3 个答案:

答案 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期间将:noticeredirect_to理解为Flash消息,否则您应该使用&#34;通用flash存储桶& #34;他们通过flash: {error: 'your message'}

来称呼它

但是传递给Hash的{​​{1}}也可以包含h​​ttp状态代码(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