首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails: CanCanCan - AccessDenied错误不显示

Rails: CanCanCan - AccessDenied错误不显示
EN

Stack Overflow用户
提问于 2018-05-31 16:00:24
回答 3查看 732关注 0票数 0

我在我的rails应用程序中使用CanCanCan进行授权。路由和重定向工作得很好,但我没有设法显示AccessDenied错误消息(它以前是有效的,但我一定是在途中搞砸了什么,现在它就是不显示了)。

下面是我的代码:

controllers/application_controller.rb

代码语言:javascript
复制
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,否则我会收到devise的警告(‘你已经登录了’)。

views/index.html.haml (根)

代码语言:javascript
复制
= flash[:error] if flash[:error]
...

有什么办法让它再次工作吗?提前谢谢。

编辑--

我尝试了一些更多的修复(但没有成功):

完全用messagenotice

  • Removing

  • error替换messagerescue_from CanCan::AccessDenied方法-它将我带到标准的CanCan错误页面(所以我知道该方法本身是在重定向之前使用常规的string.

  • Adding a puts语句来exception.message )-它会像人们预期的那样在控制台中打印出来。

  • 正如@Anand Shah建议的那样在回答此question时,我在我的视图中添加了以下内容:<代码>H226<代码>F227

  • if flash:error.blank?

%p闪存哈希为blank

散列确实是空的,所以看起来闪存根本没有被保存。然后我补充说

flash.keep(:错误)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-04 21:20:09

这个问题的原因原来是我的routes.rb。除了定义devise作用域的根之外:

代码语言:javascript
复制
devise_scope :user do
  root to: "devise/sessions#new"
end

authenticated :user do
  root 'application#show', as: :authenticated_root
end

我还定义了一个额外的root (这基本上会导致双重重定向,从而导致警报丢失):

代码语言:javascript
复制
root to: 'application#show'

文档中的代码在经过必要的修改后可以正常工作(注意,我可以将其从error恢复到alert,而不会破坏代码):

代码语言:javascript
复制
rescue_from CanCan::AccessDenied do |exception|
  redirect_to root_url, alert: exception.message
end
票数 0
EN

Stack Overflow用户

发布于 2018-05-31 19:13:08

你有没有试过通过私人浏览器,以防cookie搞砸了?

你能试试这个格式吗?

代码语言:javascript
复制
redirect_to(root_url, {:flash => { :error => exception.message }})
票数 0
EN

Stack Overflow用户

发布于 2018-06-01 03:16:22

你有没有尝试过不处理这个内联代码,而是像这样:

代码语言:javascript
复制
 rescue_from CanCan::AccessDenied do |exception|
    flash[:error] =  exception.message
    redirect_to root_url
 end

它以前工作的原因是Rails将:alert:notice理解为redirect_to期间的闪光消息,否则您应该使用“通用flash存储桶”,因为它们通过flash: {error: 'your message'}调用它

然而,传递给redirect_toHash还可以包含http状态码(:status)和url查询参数(不是:alert:notice:status:flash的任何东西,并且这一切看起来就像是太多的噪声(IMO),以至于在其中放一条闪光消息来节省一行显式代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50619472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档