2009-10-10 14 views
29

Vielleicht verwende ich gerade nicht die richtige Terminologie für Ruby (und wenn ich bin bitte korrigieren Sie mich), aber Google gerade hilft mir nicht auf diesem.Calling Basisklasse Methode von überladenen Methode in Sub-Klasse

Was ich habe, ist eine Klasse (nennen Sie es OrderController), die eine andere Klasse erweitert (nennen Sie es BaseStoreController). Im BaseStoreController habe ich eine before_filter definiert, die auf meiner gesamten Site verwendet wird, mit der Ausnahme von meinem OrderController. In dieser besonderen Situation musste ich eine benutzerdefinierte before_filter definieren, die einige zusätzliche Logik und dann die before_filter in meinem BaseStoreController definiert aufrufen muss.

Was ich nicht weiß ist, wie man das macht. Hier

ist, was ich versucht habe, aber es scheint, dass die ‚super‘ Schlüsselwort ist nicht das, was ich erwartet hatte, es zu sein:

class BaseStoreController < ActionController::Base 
    before_filter :authorize 

    protected 
     def authorize 
      #common authroization logic here 
     end 
end 

und

class OrderController < BaseStoreController 
    before_filter :authorize 

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

Das Endergebnis meines Codes ist, dass die Autorisierung-Methode in der OrderController mit dem folgenden Fehler fehlschlägt:

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

Antwort

56

Haben Sie versucht, anzurufen die "authorize" Methode der Basisklasse mit nur "super" anstelle von "super.authorize"?

+2

wow! Ich denke, meine Erfahrung mit anderen Sprachen hat mir dabei geschadet ... Ich erwartete Super, eine Referenz auf die Basisklasse zu sein ... kein Verweis auf die Basisklassenmethode, die ich versteckte. Das hat wie ein Zauber funktioniert, danke! –

+3

In Ruby ist 'super' ein Aufruf der geerbten Version der Methode, also haben Sie' authorize' aufgerufen, was auch immer zurückgegeben wurde - in diesem Fall, nil'. –

+0

Wie würde man eigentlich auf die Basisklasse verweisen? – Shayne

Verwandte Themen