2016-10-26 4 views
1
私は自分のプラグインモジュールをこのよう http://www.phoenixframework.org/docs/understanding-plug#section-module-plugs

プラグモジュールを正しく作成する方法は?

セイを作成することができます

、私はリクエストのヘッダーとその値がありますかどうかを確認したかったし、彼らはcorrentた場合、いない場合は、現在の要求とリターンを終了し、さらに継続しますおそらくjsonでは特定のステータスとメッセージが表示されます。

しかし、プラグモジュールからhtmlやjsonなどを返すことはできません。コントローラに渡されたときに渡された接続構造を変更することしかできません。

それではどうすればいいですか?代わりに特定のキーを追加して、コントローラーでそれを確認する必要がありますか?しかし、それは多くの繰り返しを作成するだろうか?

# plug module 
    def call(conn, default) do 
    if condition1 
     assign(conn, :my_key, %{status: :ok, msg: "okkkeey"}) 
    else 
     assign(conn, :my_key, %{status: :error, msg: "we have problems") 
    end 

    # my_controller 
    def action1(conn) 
    # check for :my_key and its status 

答えて

4

あなたは最後に限り、あなたhalt/1としてプラグからHTMLまたはJSONを返すことができます。

# plug module 
    def call(conn, default) do 
    if condition1 
     assign(conn, :my_key, %{status: :ok, msg: "okkkeey"}) 
    else 
     conn 
     |> send_resp(400, "Something wrong") 
     |> halt() 
    end 

あなたはJSONを返すようにしたい場合は、しかし、あなたは機能はデフォルトでインポートされていないとして、完全な関数名を使用する必要があります、Phoenix.Controller.json/2を使用することができます。

def call(conn, default) do 
    if condition1 
     assign(conn, :my_key, %{status: :ok, msg: "okkkeey"}) 
    else 
     conn 
     |> put_status(400) 
     |> Phoenix.Controller.json(%{error: "We have problems"}) 
     |> halt() 
    end 
+0

私がhtmlを返すと、どうすれば適切に処理できますか?リダイレクトしてから停止しますか?それともその逆ですか?それともステータスを置くだけですか? – Meji

+0

停止はあなたのパイプラインを止めるでしょう、あなたのプラグの最後の部分としてそれを呼び出すことができますし、あなたはそれの前に好きなことをすることができます。あなたのケースであなたがすべきことは、アプリケーションによって異なります。たとえば、ユーザーが認証されていない場合、 'Phoenix.Controller.put_flash'を使用してフラッシュメッセージでログインページにリダイレクトしたい場合があります – Gazler

+0

ありがとう............... – Meji

関連する問題