2015-06-23 11 views
11

Sto seguendo lo Phoenix Guide on Plugs per creare il mio Module Plug che carica l'utente corrente dalla sessione. Il @user non viene assegnato quando si utilizza il modulo plug-in, ma funziona correttamente quando lo chiamo come funzione privata all'interno di router.ex.Plug.Conn.assign non funziona quando viene chiamato da un Pipeline Plug

Questo è il mio web/router:

defmodule MyApp.Router do 
    use MyApp.Web, :router 

    pipeline :browser do 
    plug :accepts, ["html"] 
    plug :fetch_session 
    plug :fetch_flash 
    plug :protect_from_forgery 
    plug MyApp.Plugs.User 
    end 

    # Scopes and Routes... 

end 

Questo è il mio modulo (in web/plugs/user.ex):

defmodule MyApp.Plugs.User do 
    import Plug.Conn 

    def init(default), do: default 

    def call(conn, default) do 
    user = %{ 
     id:  get_session(conn, :user_id), 
     username: get_session(conn, :username) 
    } 

    assign(conn, :user, user) 

    IO.inspect conn 
    end 
end 

Ho provato a ispezionarlo per vedere se davvero era stato assegnato, ma non è stato :

%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, assigns: %{}, 
before_send: [#Function<1.75757453/1 in Plug.CSRFProtection.call/2>, 
    #Function<1.30521811/1 in Phoenix.Controller.fetch_flash/2>, 
    #Function<0.39713025/1 in Plug.Session.before_send/2>, 
    #Function<1.7608073/1 in Plug.Logger.call/2>, 
    #Function<0.72065156/1 in Phoenix.LiveReloader.before_send_inject_reloader/1>], 
body_params: %{}, 
cookies: .... 

risposta

14

Plug.Conn.assign restituisce una connessione modificata. Poiché tutti i dati in Elisir sono immutabili, non è possibile modificare quello vecchio. Nel tuo caso stai buttando via il risultato di assign e conn ancora punti alla vecchia connessione. Probabilmente si desidera qualcosa di simile:

conn = assign(conn, :user, user) 

Ciò associare nuovamente la variabile conn per puntare alla struttura di connessione modificata. Naturalmente funzionerebbe anche se assign(conn, :user, user) fosse l'ultima espressione nella tua funzione dal momento che il suo risultato sarebbe stato restituito.

+0

Vedo ... Credo che dovrei prendere le basi per l'elisir giusto prima di passare a Phoenix. – Sheharyar

+1

Si noti inoltre che 'IO.inspect' restituisce il valore che controlla, quindi' assign (conn,: user, user) |> IO.inspect' avrebbe anche funzionato –

Problemi correlati