2014-12-08 3 views
12

Ich benutze CanCanCan, Devise & Rolify.CanCanCan wirft einen regulären Rails-Fehler auf eine Ausnahme statt einer Flash-Nachricht wie ich

Mein ApplicationController sieht wie folgt aus:

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 

Mein routes.rb sieht wie folgt aus:

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" 

Das ist mein ability.rb, die relevant ist:

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

Also, wenn ich angemeldet bin in als :member, und ich versuche, zu gehen /newsroom, bekomme ich diesen Fehler:

NameError at /newsroom 
uninitialized constant Newsroom 

Anstatt auf die root_url mit einem :alert umgeleitet werden, wie ich erwartet hätte.

Nicht sicher, was hier passiert.

Edit 1

Für das, was es wert ist, ich dies nur, wenn ich das meinem NewsroomController hinzufügen:

authorize_resource 
+1

Gibt es einen Fehler provozieren, wenn Sie/Nachrichtenredaktion als Admin loggued Zugriff – Typpex

+0

@Typpex ja, es d oes provozieren einen Fehler, wenn ich auf "/ Newsroom" als Admin angemeldet bin. – marcamillion

Antwort

2

Ich bin in CanCan nicht sehr erfahren, aber ich kann, dass Sie sehen, Es wird von CanCan :: AccessDenied gerettet, während die Ausnahme ein NameError ist. Daher sollten Sie nicht erwarten, dass Ihr Rettungsblock funktioniert.

Ich würde sagen, dass Sie wahrscheinlich "Newsroom" irgendwo falsch geschrieben haben oder darauf zugreifen, wo es nicht verfügbar ist.

+0

Die Dokumente sagen für die Ausnahmebehandlung, wir sollten retten von 'CanCan :: AccessDenied' - https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling – marcamillion