我在我的rails应用程序中使用CanCanCan进行授权。路由和重定向工作得很好,但我没有设法显示AccessDenied错误消息(它以前是有效的,但我一定是在途中搞砸了什么,现在它就是不显示了)。
下面是我的代码:
controllers/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
,否则我会收到devise的警告(‘你已经登录了’)。
views/index.html.haml (根)
= flash[:error] if flash[:error]
...
有什么办法让它再次工作吗?提前谢谢。
编辑--
我尝试了一些更多的修复(但没有成功):
完全用message
和notice
error
替换message
和rescue_from CanCan::AccessDenied
方法-它将我带到标准的CanCan错误页面(所以我知道该方法本身是在重定向之前使用常规的string.
exception.message
)-它会像人们预期的那样在控制台中打印出来。
%p闪存哈希为blank
散列确实是空的,所以看起来闪存根本没有被保存。然后我补充说
flash.keep(:错误)
在我的控制器中,但这并没有改变任何事情。
发布于 2018-06-04 21:20:09
这个问题的原因原来是我的routes.rb
。除了定义devise作用域的根之外:
devise_scope :user do
root to: "devise/sessions#new"
end
authenticated :user do
root 'application#show', as: :authenticated_root
end
我还定义了一个额外的root (这基本上会导致双重重定向,从而导致警报丢失):
root to: 'application#show'
文档中的代码在经过必要的修改后可以正常工作(注意,我可以将其从error
恢复到alert
,而不会破坏代码):
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, alert: exception.message
end
发布于 2018-05-31 19:13:08
你有没有试过通过私人浏览器,以防cookie搞砸了?
你能试试这个格式吗?
redirect_to(root_url, {:flash => { :error => exception.message }})
发布于 2018-06-01 03:16:22
你有没有尝试过不处理这个内联代码,而是像这样:
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_to
的Hash
还可以包含http状态码(:status
)和url查询参数(不是:alert
、:notice
、:status
或:flash
的任何东西,并且这一切看起来就像是太多的噪声(IMO),以至于在其中放一条闪光消息来节省一行显式代码。
https://stackoverflow.com/questions/50619472
复制相似问题