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]
...

关于如何让它重新工作有什么想法吗?提前致谢。

---编辑---

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

- 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_toHash 也可以包含 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