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
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! –
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'. –
Comment pourrait-on réellement référencer la classe de base? – Shayne