2009-10-10 13 views
29

Peut-être que je n'utilise pas la bonne terminologie pour Ruby (et si je suis s'il vous plaît corrigez-moi), mais Google ne m'aide pas sur celui-ci. Ce que j'ai est une classe (appelons-la OrderController) qui étend une autre classe (appelez-la BaseStoreController). Dans le BaseStoreController j'ai défini un before_filter qui est utilisé sur mon site, avec le petit excepté mon OrderController. Dans cette situation très particulière, j'ai besoin de définir un before_filter personnalisé qui doit faire une logique supplémentaire et ensuite appeler le before_filter défini dans mon BaseStoreController.Appeler méthode de classe de base de la méthode surchargée dans la sous-classe

Ce que je ne sais pas, c'est comment faire.

Voici ce que je l'ai essayé, mais il semble que le mot-clé « super » est pas ce que j'attendais que ce soit:

class BaseStoreController < ActionController::Base 
    before_filter :authorize 

    protected 
     def authorize 
      #common authroization logic here 
     end 
end 

et

class OrderController < BaseStoreController 
    before_filter :authorize 

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

Le résultat final de mon code est que la méthode habilitent au OrderController échoue avec l'erreur suivante:

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

Répondre

56

Avez-vous essayé d'appeler la méthode "authorize" de la classe de base avec juste "super" au lieu de "super.authorize"?

+2

wow! Je suppose que mon expérience avec d'autres langues me faisait du mal sur celui-ci ... Je m'attendais à ce que super soit une référence à la classe de base ... pas une référence à la méthode de classe de base que je cachais. Cela a fonctionné comme un charme, merci! –

+3

Dans Ruby, 'super' est un appel à la version héritée de la méthode, donc vous appeliez' authorize' sur ce qui revenait - dans ce cas, 'nil'. –

+0

Comment pourrait-on réellement référencer la classe de base? – Shayne

Questions connexes