2017-11-03 2 views
0

ich mit Elixir und Phoenix Framework zum ersten Mal spiele nach diesen Tutorial folgende ..Elixir - Überprüfen Sie, ob String leer ist

Ich habe einen einfachen Client/Server-Anwendung.

Chat/lib/chat_web/room_channel.ex:

defmodule ChatWeb.RoomChannel do 
    use Phoenix.Channel 

    def join("room:lobby", _message, socket) do 
    {:ok, socket} 
    end 
    def join("room:" <> _private_room_id, _params, _socket) do 
    {:error, %{reason: "unauthorized"}} 
    end 

    def handle_in("new_msg", %{"body" => body}, socket) do 
    broadcast! socket, "new_msg", %{body: body} 
    {:noreply, socket} 
    end 
end 

ich leer eingehende Nachrichten blockieren möchten (body ist leerer String)

def handle_in("new_msg", %{"body" => body}, socket) do 
    # I guess the code should be here.. 
    broadcast! socket, "new_msg", %{body: body} 
    {:noreply, socket} 
end 

Wie kann ich das tun?

Antwort

3

Ich möchte leer eingehende Nachrichten blockieren (Körper ist leerer String)

Sie können eine Schutzklausel für diese hinzufügen. Entweder when body != "" oder when byte_size(body) > 0

def handle_in("new_msg", %{"body" => body}, socket) when body != "" do 
    ... 
end 

Nun wird diese Funktion nur überein, wenn body nicht "".

Wenn Sie auch leere Körper Fall behandeln möchten, können Sie zwei Klauseln wie folgt aus (keine Notwendigkeit für die Schutzklausel nicht mehr, da die zweite Klausel wird niemals übereinstimmen, wenn Körper leer ist) hinzufügen:

def handle_in("new_msg", %{"body" => ""}, socket) do 
    # broadcast error here 
end 
def handle_in("new_msg", %{"body" => body}, socket) do 
    # broadcast normal here 
end 
+0

hat den Trick zu verwenden! Danke! –

+0

Ist es möglich, eine Art von Fehler zurückzugeben, anstatt diese Nachrichten zu ignorieren? –

+0

Ja, Sie können eine weitere Klausel für "body" => "" hinzufügen. Ich habe meine Antwort bearbeitet, um das zu berücksichtigen. – Dogbert

2

Sie kann die von @Dogbert vorgeschlagene Antwort verwenden, aber um 100% sicher zu sein, dass die Zeichenfolge nicht leer ist, können Sie die broadcast! in der privaten Helferfunktion umbrechen oder einfach in den Ausdruck if oder unless (negativ if) umbrechen.

unless String.trim(body) == "" do 
    broadcast! socket, "new_msg", %{body: body} 
end 

Wenn Sie eine Fehlermeldung Sie etwas komplexere zB versuchen zurückzukehren .:

schön
if String.trim(body) != "" do 
    broadcast! socket, "new_msg", %{body: body} 
else 
    broadcast! socket, "error_msg", %{body: "Body is empty"} 
end 
+1

Danke! @Dogbert Lösungen ist so einfach ... also bin ich mir immer noch nicht sicher, ob ich tatsächlich Fehlermeldungen zurückgeben oder diese Nachrichten ignorieren muss, aber ursprünglich suchte ich eigentlich nach etwas wie deiner Lösung .. Schade, kann ich nicht akzeptiere beide Antworten, denn beide sind großartig! –