Rails: CanCanCan - AccessDenied 错误未显示
Rails: CanCanCan - AccessDenied error not displaying
我在我的 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
,否则我将收到来自设计 ('You are already logged in') 的警报。
views/index.html.haml(根)
= flash[:error] if flash[:error]
...
关于如何让它重新工作有什么想法吗?提前致谢。
---编辑---
我尝试了一些修复(但没有成功):
将 error
替换为 message
和 notice
完全删除 rescue_from CanCan::AccessDenied
方法 - 它把我带到了标准的 CanCan 错误页面(所以我知道该方法本身正在工作)。
将 exception.message
替换为常规字符串。
在重定向之前添加一条 puts 语句 - 它会按预期打印在控制台中。
正如@Anand Shah 在对此 question 的回答中所建议的,我在我的观点中添加了以下内容:
- if flash[:error].blank?
%p flash hash is blank
散列确实是空的,所以闪存似乎根本没有被保存。然后我添加了
flash.keep(:error)
在我的控制器中,但这并没有改变任何东西。
您是否通过私人浏览器尝试过以防 cookie 出错?
你能试试这个格式吗?
redirect_to(root_url, {:flash => { :error => exception.message }})
你有没有试过不处理这个内联而是像这样:
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = exception.message
redirect_to root_url
end
它之前工作的原因是 Rails 在 redirect_to
期间将 :alert
和 :notice
理解为闪存消息,否则你应该使用 "general purpose flash
bucket" 作为他们通过 flash: {error: 'your message'}
来称呼它
但是传递给 redirect_to
的 Hash
也可以包含 http 状态代码 (:status
) 和 url 查询参数(任何不是 :alert
、:notice
、:status
或 :flash
,这一切似乎都太吵了(IMO),无法在其中放置一条 flash 消息以节省 1 行显式代码。
这个问题的原因竟然是我的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
我在我的 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
,否则我将收到来自设计 ('You are already logged in') 的警报。
views/index.html.haml(根)
= flash[:error] if flash[:error]
...
关于如何让它重新工作有什么想法吗?提前致谢。
---编辑---
我尝试了一些修复(但没有成功):
将
error
替换为message
和notice
完全删除
rescue_from CanCan::AccessDenied
方法 - 它把我带到了标准的 CanCan 错误页面(所以我知道该方法本身正在工作)。将
exception.message
替换为常规字符串。在重定向之前添加一条 puts 语句 - 它会按预期打印在控制台中。
正如@Anand Shah 在对此 question 的回答中所建议的,我在我的观点中添加了以下内容:
- if flash[:error].blank?
%p flash hash is blank
散列确实是空的,所以闪存似乎根本没有被保存。然后我添加了
flash.keep(:error)
在我的控制器中,但这并没有改变任何东西。
您是否通过私人浏览器尝试过以防 cookie 出错?
你能试试这个格式吗?
redirect_to(root_url, {:flash => { :error => exception.message }})
你有没有试过不处理这个内联而是像这样:
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = exception.message
redirect_to root_url
end
它之前工作的原因是 Rails 在 redirect_to
期间将 :alert
和 :notice
理解为闪存消息,否则你应该使用 "general purpose flash
bucket" 作为他们通过 flash: {error: 'your message'}
但是传递给 redirect_to
的 Hash
也可以包含 http 状态代码 (:status
) 和 url 查询参数(任何不是 :alert
、:notice
、:status
或 :flash
,这一切似乎都太吵了(IMO),无法在其中放置一条 flash 消息以节省 1 行显式代码。
这个问题的原因竟然是我的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