2017-02-06 4 views
2

Ich habe eine Reihe von Transformation auf Plug.Conn, die Zugriff auf Zwischenergebnisse benötigt.Wie kann ich auf den Parameter zugreifen, der über den Pipe-Operator in Elixir übergeben wurde?

n_conn = 
    conn 
    |> Plug.Conn.fetch_query_params() 
nn_conn = 
    n_conn 
    |> assign(:result, inspect(Timestamp.convert_datetime(n_conn.params))) 
nn_conn 
|> send_resp(200, nn_conn.assigns.result) 
|> halt() 

Ich brauche n_conn weil conn.params nicht gesetzt ist, bis Plug.Conn.fetch_query_params() genannt wird. Ebenso brauche ich nn_conn weil n_conn.assigns.result nicht gesetzt ist bis assign/3 Funktion aufgerufen wird.

Der Code ist ziemlich hässlich. Wenn es einen Weg gäbe, sich auf die Ausgabe des Rohroperators zu beziehen, könnte ich es wie folgt vereinfachen. Ich hatte gehofft, dass &1 funktioniert, aber es nicht tut.

conn 
|> Plug.Conn.fetch_query_params() 
|> assign(:result, inspect(Timestamp.convert_datetime(&1.params))) 
|> send_resp(200, &1.assigns.result) 
|> halt() 

Gibt es eine Möglichkeit, damit umzugehen?

Antwort

2

Sie können anonyme Funktionen übergeben, wenn Sie dies nur über Pipes tun möchten, aber it's ugly. Ich würde den Namen conn wiederverwenden und nicht für einzelne Funktionsaufrufe verwenden Rohre:

conn = Plug.Conn.fetch_query_params(conn) 
conn = assign(conn, :result, inspect(Timestamp.convert_datetime(conn.params))) 
conn 
|> send_resp(200, conn.assigns.result) 
|> halt() 

Da Sie nicht zu verwenden conn.assigns.result scheinen, könnte man überspringen es in assigns speichern:

conn = Plug.Conn.fetch_query_params(conn) 
result = inspect(Timestamp.convert_datetime(conn.params)) 
conn 
|> send_resp(200, result) 
|> halt() 
Verwandte Themen