2009-10-10 7 views
29

おそらく私はRubyの正しい用語を使用していないかもしれませんが(私が訂正してください)、Googleはこれで私を助けてくれません。サブクラスのオーバーロードされたメソッドからの基底クラスメソッドの呼び出し

私が持っているのは、別のクラス(BaseStoreControllerと呼ぶ)を拡張するクラス(OrderControllerと呼ぶ)です。 BaseStoreControllerでは、自分のサイト全体で使用されているbefore_filterを定義しました。この非常に特殊な状況では、私は追加のロジックを行う必要があるカスタムbefore_filterを定義する必要がありました。before_filterをBaseStoreControllerに定義して呼び出します。

これを行う方法はわかりません。ここで

は、私が試したものですが、「スーパー」キーワードは、私はそれがあることを期待していたものではないことが表示されます:

class BaseStoreController < ActionController::Base 
    before_filter :authorize 

    protected 
     def authorize 
      #common authroization logic here 
     end 
end 

class OrderController < BaseStoreController 
    before_filter :authorize 

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

最終結果私のコードのOrderControllerのauthorizeメソッドが次のエラーで失敗しているということです:

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

答えて

56

"super.authorize"の代わりに "super"だけの基本クラスの "authorize"メソッドを使用しますか?

+2

うわー! 私は他の言語での私の経験が私にこのことを害していたと思います...私はスーパークラスがベースクラスへの参照になると予想しました...私が隠していたベースクラスメソッドへの参照ではありません。 それは魅力のように働いた、ありがとう! –

+3

Rubyでは、 'super'はメソッドの継承バージョンへの呼び出しです。返されたものに' authorize'を呼び出していました。この場合は 'nil'です。 –

+0

基本クラスを実際にどのように参照していますか? – Shayne

関連する問題