2016-07-26 12 views
0

Ich habe eine "halt/1" in einer Steuerung auf der Grundlage einiger Logik, aber nicht in einem Stecker. Leider leitet es den Redirect, aber auch den Code nach der Weiterleitung.'halt' (Plug.Conn.halt/1) stoppt die Aufrufkette nicht nach einer Umleitung in der Steuerung

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 

Ich brauche eigentlich den Anruf nach der Weiterleitung zu beenden, irgendwelche Ideen?

Antwort

2

Es gibt keine return in Elixir - Sie können eine Funktion nicht vorzeitig verlassen. Wenn Sie das brauchen, refaktorieren Sie Ihre if so, dass alle Anweisungen, die nicht ausgeführt werden müssen, im Zweig else sind.

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 

Wenn condition()true der erste Zweig ausführt, und das Ergebnis der redirect zurückgeführt wird (die Antwort eine Umleitung anzeigt). Wenn es false ist, gibt der zweite Zweig das Ergebnis render zurück.

Beachten Sie auch, dass, wenn es etwas nach der if gibt, es unabhängig davon ausgeführt wird, welcher Zweig genommen wird und das Ergebnis dieser Sache von der Aktion zurückgegeben wird - wahrscheinlich nicht das, was Sie wollen.

+0

traurig :(gibt es keine 'Rückkehr' – Devaroop

1

Es gibt keinen halt/0. Sie rufen tatsächlich Plug.Conn.halt/1 an (beachten Sie, dass Sie den Pipe-Operator (|>) verwenden, um die Variable zu übergeben, von der ich annahm, dass sie mit %Plug.Conn{} übereinstimmt).

Plug.Conn.halt/1 stoppt nur Stecker folgen Ihrem aktuellen Stecker aus ausführen (denken Sie daran, dass letztlich Controller-Methoden auch nur Stecker sind, und dass Stecker immer zusammensetzbar sind).

Sie sollten dies so umgestalten, dass alle Aktionen, die Sie ausführen möchten, wenn die Anweisung nicht gilt, im Else-Block sind.

+0

Danke, änderte die Frage zu halt/1 – Devaroop