2009-10-10 17 views
29

Forse sto semplicemente non usando la terminologia corretta per Ruby (e se io sono per favore correggetemi), ma Google proprio non mi sta aiutando in questo.chiamata metodo della classe base da metodo di overload in sottoclasse

Quello che ho è una classe (lo chiamano OrderController) che si estende un'altra classe (lo chiamano BaseStoreController). Nel BaseStoreController ho definito un before_filter utilizzato nel mio sito, con il piccolo ad eccezione del mio OrderController. In questa stessa situazione particolare avevo bisogno di definire una consuetudine before_filter che ha bisogno di fare un po 'di logica addizionale e quindi chiamare il before_filter definito nel mio BaseStoreController.

Quello che non so è come fare questo.

Ecco quello che ho provato, ma sembra che la parola 'super' non è quello che mi aspettavo che fosse:

class BaseStoreController < ActionController::Base 
    before_filter :authorize 

    protected 
     def authorize 
      #common authroization logic here 
     end 
end 

e

class OrderController < BaseStoreController 
    before_filter :authorize 

    protected 
     def authorize 
      #additional authroization logic here 
      super.authorize 
     end 
end 

Il risultato finale del mio codice è che il metodo di autorizzazione in OrderController non riesce con il seguente errore:

 
You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.authorize 

risposta

56

Hai provato a chiamare il metodo "authorize" della classe base con solo "super" anziché "super.authorize"?

+2

Eeeek !!! Credo che la mia esperienza con altri linguaggi mi stava danneggiando su questo ... mi aspettavo super per essere un riferimento alla classe di base ... non un riferimento al metodo della classe base mi nascondevo. Che ha funzionato come un fascino, grazie! –

+3

In Ruby, 'super' è una chiamata alla versione ereditata del metodo, quindi chiamavi' authorize' su qualunque cosa restituisse - in questo caso, 'nil'. –

+0

Come si fa effettivamente riferimento alla classe base? – Shayne

Problemi correlati