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

価値があるのは、これを my に追加した場合にのみ取得できますNewsroomController:

authorize_resource
4

2 に答える 2

2

私はCanCanの経験があまりありませんが、例外がNameErrorであるのに対し、CanCan::AccessDeniedから救出していることがわかります。したがって、レスキュー ブロックが機能するとは思わないでください。

おそらくどこかで「Newsroom」のスペルを間違えたか、アクセスできない場所でアクセスしていると思います。

于 2014-12-17T01:13:58.140 に答える
2

Newsroom問題は、コントローラーを承認する方法にあったことが判明しました。これは、コントローラーNewsroomが安らかではないためです (つまり、Newsroom.

これをコントローラーの上部に追加する必要がありました:

authorize_resource :class => false

ここで指定されているとおり: https://github.com/CanCanCommunity/cancancan/wiki/Non-RESTful-Controllers#alternative-authorize_resource

于 2014-12-17T22:36:49.740 に答える