2017-04-20 3 views
1

Ich möchte Benutzer Metadaten über die :meta Karte in Phoenix Präsenz übergeben, um es von der JavaScript-Seite zugreifen. Genauer gesagt möchte ich in der Lage sein, Bilddateipfade (Strings) zu pushen und sie jedem Benutzer in meiner Anwesenheitsliste zuzuordnen. Die Dokumentation gibt dieses Beispiel für das Überschreiben der/2-Funktion holen Benutzermodelldaten in die :meta Karte hinzuzufügen:Phönix Präsenz holen/2 überschreiben

def fetch(_topic, entries) do 
    query = 
    from u in User, 
     where: u.id in ^Map.keys(entries), 
     select: {u.id, u} 

    users = query |> Repo.all |> Enum.into(%{}) 

    for {key, %{metas: metas}} <- entries, into: %{} do 
    {key, %{metas: metas, user: users[key]}} 
    end 
end 

Allerdings, wenn ich die entsprechenden Änderungen für meine User-Modell machen, bekomme ich Fehler in Bezug auf die Variablen u und die Funktion von/2 sowie cannot use ^Map.keys(entries) outside of match clauses.

Ich suchte nach Beispielen für Leute, die ähnliche Sachen machen wollten und nichts auf Github finden konnten, das dem ähnelt, was ich hier versuche.

Wer hat eine Idee, wie ich die Fetch/2-Funktion umstrukturieren kann, so dass es richtig funktioniert? Ich habe ein einfaches Benutzermodell mit 3 Feldern, E-Mail, Passwort und Icon/Avatar Bild.

+0

Versuchen Sie 'require Ecto.Query' am Anfang der Datei. Ihre Fehler sind typisch für diejenigen, die ich sehe, wenn ich die Datei nicht benötigt habe. Stellen Sie außerdem sicher, dass Sie 'Ecto.Query' importiert haben. –

+0

Edit: Nein, das hat die Fehlercodes nicht geändert. Ich bekomme immer noch die 'Warnung: Variable" u "existiert nicht und wird zu" u() "erweitert, verwende bitte Klammern, um die Mehrdeutigkeit zu entfernen oder ändere den Variablennamen' als Hauptwarnung und die anderen, wenn ich es manuell eintippe in den repl, auch nach Ecto.Query und meinem Benutzermodell. – Abeltensor

+0

'from' ist ein Ecto.Query-Makro. Sie müssen dies nicht in Controllern und Modellen tun, da es bereits in web.ex eingerichtet ist, wenn Sie beispielsweise "MyApp.Web,: controller" verwenden. –

Antwort

0

Sie müssen Ecto.Query importieren, um das from Makro zu verwenden. Dies geschieht in Ihrer web.ex Datei, also wenn Sie use MyApp.Web, :controller, haben Sie es über den quote Block in web.ex importiert. Sie müssen dies jedoch manuell in anderen Modulen durchführen.

folgendes an die Spitze Ihrer Anwesenheit Modul hinzufügen wie diese

defmodule MyApp.Presence do 
    use Phoenix.Presence, otp_app: :my_app, 
         pubsub_server: MyApp.PubSub 
    import Ecto.Query 
    # ... 
end 
0

ich herausgefunden habe, was mein Problem ist. Grundsätzlich ist die metas Karte in meiner Anwendung nicht immer mit dem Wert gefüllt, den ich möchte. In diesem Fall hat es nicht immer das user.id darin. Wenn ein Benutzer dem Kanal beitritt, wird die Abruffunktion anscheinend mindestens 4 Mal aufgerufen. Wenn ich die Abruffunktion entries map nach dem Ausführen Map.keys darauf überprüfen, gibt sie:

["1"] 
["1"] 
[] 
[] 

Also im Grunde in zwei der vier Fälle, in denen die Funktion Abruf aufgerufen wird, mein Kanal ca. 2 leere Werte für die zurückkehrt Schlüssel und wenn diese leeren Werte in die Abfrage eingegeben werden, verursacht es einen Fehler.

Leider bedeutet dies, dass es einen Fehler gibt, wo sonst in der Anwendung dieser leere Wert an meine Abruffunktion übergeben wird; am wahrscheinlichsten in den JavaScript- oder meinen Kanalmodulen.

Ich muss diese App von Grund auf neu erstellen, also denke ich, dass diese Frage geschlossen ist. Alternativ könnte ich eine Fehlerbehandlung in Form einer Wächter- oder Musterübereinstimmungsanweisung einbauen, um sich vor diesen leeren Werten zu schützen, aber ich denke, es wäre auf lange Sicht besser, wenn ich einfach neu starte.

Verwandte Themen