2017-01-02 5 views
3

Ich versuche zu testen, ob eine Benutzer-ID ist die Ressource-ID mit Guardian Auth. Wenn es kein aktuelles Token gibt und ich versuche, zu einer URL zu gelangen, die nach einem Token sucht, bekomme ich den Fehler function nil.id/0 is undefined or private. Ich komme aus einem Ruby-Hintergrund und ich weiß nicht, warum es sagt, .id ist eine Funktion? und warum dies einen Fehler verursacht. Hier ist mein Code:Funktion nil.id/0 ist undefined oder private - Elixir

def index(conn, %{"user_id" => user_id}) do 
    user = Repo.get(User, user_id) 
      |> Repo.preload(:projects) 
    cond do 
     user.id == Guardian.Plug.current_resource(conn).id -> 
     conn 
     |> render("index.html", projects: user.projects, user: user) 
     :error -> 
     conn 
     |> put_flash(:info, "No access") 
     |> redirect(to: session_path(conn, :new)) 
    end 
    end 

Wenn es keine current_resource gibt, dann druckt es diesen Fehler. Aber wenn es keine current_resource gibt, will ich nur, dass es weiter zum: error path geht und den Session-Pfad rendert.

Antwort

1

Dies ist weil Sie Guardian.Plug.current_resource(conn).id anrufen und Guardian.Plug.current_resource(conn) ist nil. Da nil ist ein Atom in Elixir und so sind Module, .id darauf versucht, die Funktion id auf dem Modul mit dem Namen nil (die nicht existiert) zu nennen. Um dies zu beheben, können Sie eine weitere Überprüfung hinzufügen, um zu sehen, ob Guardian.Plug.current_resource(conn) nicht gleich Null ist:

cond do 
    (resource = Guardian.Plug.current_resource(conn)) && user.id == resource.id -> 
    conn 
    |> render("index.html", projects: user.projects, user: user) 
    :error -> 
    conn 
    |> put_flash(:info, "No access") 
    |> redirect(to: session_path(conn, :new)) 
end 
+0

ich die Hilfe zu schätzen wissen Ich denke, du hast recht, aber ich bin erhalte diese Störung, wenn ich den Code ändern. 'web/controllers/admin/project_controller.ex: 12: undefinierte Funktionsressource/0'. Das ist, wenn ich die Zeile zu dieser Ressource ändere == Guardian.Plug.current_resource (conn) && user.id = resource.id' – Bitwise

+0

Sorry vergessen, Sie zu markieren – Bitwise

+0

Das ist 'resource =', nicht '=='. – Dogbert

Verwandte Themen