2016-07-26 5 views
0

ロジックに基づいてコントローラに「停止/ 1」がありますが、プラグにはありません。悲しいことに、それはリダイレクトしますが、リダイレクト後にコードを実行します。'halt'(Plug.Conn.halt/1)は、コントローラーのリダイレクト後にコールチェーンを停止しません。

if true do 
    conn 
    |> put_flash(:error, "Sorry, entered wrong") 
    |> redirect(to: route_path(conn, :show, model)) 
    |> halt #this does not work :(
else 
    _ #something 
end 

update_another_model() #this is executed 
render(conn, "abc.html", model: model) #even this is executed 

私は実際にリダイレクト、任意のアイデアの後に終了する呼び出しが必要ですか?

答えて

2

エリクシールにはreturnがありません。機能を早期に終了することはできません。必要な場合は、ifをリファクタリングして、実行する必要のないすべてのステートメントがelseブランチにあるようにします。

if condtition() do 
    conn 
    |> put_flash(:error, "Sorry, entered wrong") 
    |> redirect(to: route_path(conn, :show, model)) 
else 
    update_another_model() 
    render(conn, "abc.html", model: model) 
end 

condition()true第一分岐実行するとredirectの結果(レスポンスがリダイレクトを示す)が返された場合。 falseの場合、2番目のブランチはrenderの結果を返します。

ifの後に何かがある場合、それはどの分岐が取られても実行され、その結果はアクションから返されます - おそらくあなたが望むものではないでしょう。

+0

悲しいことに、返信はありません – Devaroop

1

停止/ 0はありません。実際にはPlug.Conn.halt/1を呼び出しています(パイプ演算子(|>)を使用して、connという変数を渡しています(これは%Plug.Conn{}と一致します)。

Plug.Conn.halt/1は、現在のプラグが実行された後のプラグだけを停止します(最終的にコントローラメソッドはプラグでもあり、プラグは常に構成可能です)。

ステートメントが保持されていない場合に発生するすべてのアクションがelseブロックにあるように、これをリファクタリングする必要があります。

+0

ありがとうございました。 – Devaroop

関連する問題