2014-12-08 31 views
12

Sto utilizzando CanCanCan, Devise & Rolifica.CanCanCan genera un errore regolare di Rails su un'eccezione piuttosto che un messaggio flash come ho specificato

mio ApplicationController assomiglia a questo:

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 

mio routes.rb assomiglia a questo:

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" 

Questo è il mio ability.rb che è rilevante:

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

Così, quando sono entrato in come :member, e cerco di andare a /newsroom, ottengo questo errore:

NameError at /newsroom 
uninitialized constant Newsroom 

Invece di essere reindirizzato al root_url con una :alert come mi sarei aspettato.

Non so cosa sta succedendo qui.

Modifica 1

Per quello che vale, ho solo questo quando aggiungo questo al mio NewsroomController:

authorize_resource 
+1

vuol provocano un errore se si accede/newsroom loggued come amministratore – Typpex

+0

@Typpex sì, d oes provoca un errore se accedo a '/ newsroom' loggato come admin. – marcamillion

risposta

2

io non sono molto esperto nella CanCan ma posso vedere che si stai salvando da CanCan :: AccessDenied mentre l'eccezione è un NameError. Quindi non dovresti aspettarti che il tuo blocco di soccorso funzioni.

Direi che probabilmente hai sbagliato a digitare "Newsroom" da qualche parte o lo stai accedendo dove non è disponibile.

+0

I documenti dicono per la gestione delle eccezioni, dovremmo salvare da 'CanCan :: AccessDenied' - https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling – marcamillion