2017-03-25 9 views
0

を作成し、私は私自身のプラグモジュールがあります。、ほぼ正確に同じ2つのプラグが、わずかに異なる

defmodule Module1 do 

    def init(opts) do 
    opts 
    end 

    def call(conn, _opts) do 
    # if some_condition1 
    # something 
    end 

    # other stuff 
end 

をそしてrouter.ex

pipeline :pipeline1 do 
    plug(Module1) 
    end 

    scope "/scope", MyApp, as: :scope1 do 
    pipe_through([:browser, :pipeline1]) 
    # ....... 

で、私は第2のパイプラインやスコープを作成したいです同じモジュールModule1]を使用すると:私は第二のモジュールを作成した場合

pipeline :pipeline2 do 
    plug(Module1) 
    end 

    scope "/scope2", MyApp, as: :scope2 do 
    pipe_through([:browser, :pipeline2]) 
    # ....... 

しかし、違いはこれだけでは次のようになります。

def call(conn, _opts) do 
    # if some_condition1 and some_condition2 
    # something 
    end 

つまり、私は「some_condition2」を追加しただけで、それ以外は同じままです。

どうすればいいですか?まったく同じモジュールModule2をModule1と同じように作成し、「呼び出し」をsligtlyに変更する必要がありますか?コードの重複が発生します。

答えて

7

これは、Plugのoptsの意味です。あなたのplug呼び出しからそれを渡した後、call内でそれを使用することができます:

pipeline1で今
pipeline :pipeline1 do 
    plug Module1, check_both: false 
end 

pipeline :pipeline2 do 
    plug Module1, check_both: true 
end 
defmodule Module1 do 
    def init(opts), do: opts 

    def call(conn, opts) do 
    if opts[:check_both] do 
     # if some_condition1 and some_condition2 do something... 
    else 
     # if some_condition1 do something... 
    end 
    end 
end 

opts[:check_both]はfalseになります、とpipeline2で、それは本当でしょう。


私はここにキーワードリストを渡しているが、それは(それがキーワードにも表示されますよりも少し速くする必要があります)十分だ場合、あなたは1つだけtrueまたはfalseさえ、何かを渡すことができます。

optsでいくつかの前処理をinit/1に行うこともできます。今すぐ初期値を返します。

関連する問題