2017-02-08 1 views
0

シールドを使用してOauth2サーバー(Oauth2srvと呼ばれます)を構築しようとしています。しかし、それは問題のことではありません。この例のコードでは、基本的に次のようにしています:スコープセクションの複数のモジュールのコントローラを使用する

scope "/", Shield do 
    pipe_through :api 

    get "/apps", AppController, :index 
    .. etcetera .. 
end 

シールドモジュールは依存関係にあるため、deps/shieldにあります。すべてのルートもそこにあります。 は今、私はこのような自分のモジュール内のコントローラへのルートを追加したい:

scope "/", Shield do 
    pipe_through :api 

    get "/apps", AppController, :index 
    get "/*", Oauth2srv.CatchallController, :catch_it 
end 

CatchallControllerは、Web /コントローラ/ catchall_controller.exに存在します。しかし、スコープは同じディレクトリ内のすべてのコントローラを期待しているようで、コンパイラは私にエラー:function Shield.Oauth2srv.CatchallController.init/1 is undefinedを投げます。

何をする必要がありますか?

+0

「あなたのスコープは、同じディレクトリ内のすべてのコントローラを期待しているようです」と言ってください。それはエリクシールの仕組みではありません。エリクサーはコンパイルされた言語です。したがって、名前にかかわらず、技術的に任意のディレクトリにモジュールを置くことができます。モジュール検索の便宜のために、ディレクトリ構造をモジュール名に従わせると便利です。 –

答えて

1

おそらく、異なるスコープを使用することになります。あなたは

scope "/", Shield do 
    get "/apps", AppController, :index 
end 

をしたときにあなたがShield.AppControllerという名前のモジュールを持っていることを言っているので、あなたは、キャッチにShield範囲内のすべてのルートを追加したとき、あなたはShield.CatchallControllerモジュールを持っているコンパイラを語っています。

エラーに応じて、コンパイラはShield.Oauth2srv.CatchallControllerOauth2srvに注意してください)を探していますが、だからあなたは情報のすべてを与えなかったか、それ以外に何か起こっていることがあります。

これらは、あなたのアプリケーションで定義されている唯一の2つのルートであれば、あなたはより多くを持っている場合は、複数のスコープを指定することもできます

scope "/" do 
    get "/apps", Shield.AppController, :index 
    get "/*", MyApp.CatchallController, :catch_it 
end 

ような何かを行うことができます。何かのように

+0

お返事ありがとうございます。私は実際にスコープ動詞が何をしているのか分かりません。それは機能ですか?決してRubyに触れていないので、機能を認識することができず、かっこはありません。 – raarts

+0

スコープは、パスプレフィックス、すべてのコントローラ名にそのスコープのプレフィックスを付けるスコープ名、およびルートのグローバルリストにルートを追加する関数であることを正しく理解していますか? – raarts

+0

['scope'](https://hexdocs.pm/phoenix/Phoenix.Router.html#scope/2)はマクロです。あなたはRubyに触れていないとも言いますが、ElixirはRubyとは非常に異なっています。あなたは自分自身と他の人たちとを直接比較しようとすることで不快感を感じます。 –

関連する問題