2017-01-27 1 views
0

私はDevise gemの問題を解決しようとしています。問題は、devise_token_authで標準deviseを使用しているときです。クラスコンテキストは同じ名前のモジュールメソッドをオーバーライドしますか?

application_controller.rbで

、devise_token_authは、モジュールを追加する必要があります:

class ApplicationController < ActionController::Base 
    include DeviseTokenAuth::Concerns::SetUserByToken 

このSetUserBytTokenモジュールを追加した後、私はブラウザ(ない/ API/V1 /認証/内のユーザ/ sign_inパスを読み込みますサインイン)。 users/sign_inパスは、devise_token_authではなく、deviseをロードする必要があります。

def resource_class(m=nil) 
:次のようになり、同じファイル内のメソッドがあり

def set_user_by_token(mapping=nil) 
    # determine target authentication class 
    rc = resource_class(mapping) 

wrong number of arguments (given 1, expected 0) def resource_class

devise_token_authはset_user_by_token.rbでこれを呼び出す:

はしかし、私はエラーを取得します

このメソッドは、DEFAULT引き数を受け入れます。しかし、あなたはエラーを見ました。

wrong number of arguments (given 1, expected 0)

この方法はいくつかの方法を上書きする必要があります。これをチェックアウト:

http://www.rubydoc.info/github/plataformatec/devise/DeviseController%3Aresource_class

考案は、オプションの引数を取りません同じ名前のメソッドを持っています。私はそのメソッドがSetUserByTokenモジュールで定義されているメソッドをオーバーライドする方法を理解していません。 SetUserByTokenのメソッドを呼び出すので、モジュールで定義されたものをルビーで見るべきではありません。 https://github.com/lynndylanhurley/devise_token_auth/blob/master/app/controllers/devise_token_auth/concerns/set_user_by_token.rb

+1

あなたの継承階層は私には不明です。しかし、あなたの質問のタイトルに行く: "クラスコンテキストは、同じ名前を持つモジュールメソッドをオーバーライドしますか?"はい、それはどのように動作します。 'クラスC; M endを含むと 'M 'は' C 'のスーパークラスになります。それだけです。 'M'は' C'のスーパークラス(または 'C'は' M'のサブクラスです)であるので、 'C'で定義されたメソッドは' M'で定義されたメソッドをオーバーライドします。働く'M'メソッドが' C'をオーバーライドするようにするには 'prepend'を使う必要があります。これは' M'を 'ancestors'リストの* front *に入れます。 –

+0

はい、私の質問に答えました。それにもかかわらず、私はsimple_token_authentication gem isnteadに移動しました。これは維持されず、上記のものより多くの問題があります。 – Donato

+0

そこに重複した質問があることは確かですが、現時点でそれを見つけることはできません。たぶん、より良い検索スキルを持つ他の人が質問を閉じることができます。それまでの間、私はすぐに答えを出すつもりです。 –

答えて

0

Class context overrides Module methods with the same name?

はい、それはどのように動作するのですか。

class C 
    include M 
end 

は、それはそれがないすべてです、MCのスーパークラスになります。 M以来

は、Mで定義されたCオーバーライドメソッドで定義されたメソッドは、それが継承が働くだけの方法です(または他の側Cからそれを見Mのサブクラスである)Cのスーパークラスです。

あなたはS MCをオーバーライドするSメソッドを」が必要な場合は、ancestorsリストの前でMを置くプリペンドを使用する必要があります。より正確


M′ 'がそのクラス変数テーブルポインタ、定数テーブルポインタ、およびメソッドテーブルポインタ点Mへのクラス変数テーブル、Mの定数テーブル、及びM作成されたクラスを含みますメソッドテーブル。 M′のスーパークラスポインタがCのスーパークラスに設定されている場合、CのスーパークラスポインタはM′に設定されます。Object#classClass#superclassメソッドは、シングルトンクラスをスキップしてクラスを含めることを知っており、Module#ancestorsはインクルードクラスの代わりに対応するモジュールを返すことを知っているので、を参照してください。を参照してください。

これは、クラスに定義されたメソッドが、含まれるモジュールで定義されたメソッドをオーバーライドする理由を説明します。モジュールによるsuperの動作についても説明します。それはまったく簡単なクラス継承です。