12

我正在使用 CanCanCan、Devise & Rolify。

我的ApplicationController样子是这样的:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_filter :new_post

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end

  def new_post
    @post = Post.new
  end  

end

我的routes.rb样子是这样的:

  authenticate :user, lambda { |u| u.has_role? :admin or :editor } do
    get 'newsroom', to: 'newsroom#index', as: "newsroom"
    get 'newsroom/published', to: 'newsroom#published'
    get 'newsroom/unpublished', to: 'newsroom#unpublished'    
  end

# truncated for brevity
  root to: "posts#index"

这是我ability.rb的相关:

elsif user.has_role? :member
    can :read, :all
    cannot :read, :newsroom

因此,当我以 身份登录:member并尝试转到 时/newsroom,我收到此错误:

NameError at /newsroom
uninitialized constant Newsroom

而不是像我所期望root_url的那样被重定向到。:alert

不知道这里发生了什么。

编辑 1

对于它的价值,我只有在将它添加到我的时才会得到这个NewsroomController

authorize_resource
4

2 回答 2

2

我在 CanCan 方面不是很有经验,但我可以看到你正在从 CanCan::AccessDenied 中解救出来,而例外是 NameError。因此,您不应该期望您的救援块起作用。

我会说您可能在某处拼错了“新闻编辑室”,或者正在访问它不可用的地方。

于 2014-12-17T01:13:58.140 回答
2

事实证明,问题出在我授权Newsroom控制器的方式上——因为Newsroom它是一个非 RESTful 控制器(即没有与Newsroom.

我不得不将它添加到我的控制器的顶部:

authorize_resource :class => false

如此处所述:https ://github.com/CanCanCommunity/cancancan/wiki/Non-RESTful-Controllers#alternative-authorize_resource

于 2014-12-17T22:36:49.740 回答