2017-11-03 5 views
0

내가 처음 ElixirPhoenix Framework와 함께 연주하고 비어있는 경우 엘릭서 - 문자열이 <a href="https://hexdocs.pm/phoenix/channels.html" rel="nofollow noreferrer">Tutorial</a>을 다음 후

나는 간단한 클라이언트/서버 응용 프로그램을 가지고 .. 확인합니다.

채팅/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 

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 

내가 어떻게 할 수 있습니다 (body은 빈 문자열입니다)?

답변

3

나는

당신은이에 대한 보호 조항을 추가 할 수 있습니다 (몸이 빈 문자열) 빈 수신 메시지를 차단하려는. body""가 아닌 경우 어느 when body != "" 또는 when byte_size(body) > 0

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

지금이 기능은 일치합니다. 당신은 또한 빈 본체 케이스를 처리하는 경우 (몸이 비어있는 경우 일치하지 않습니다 두 번째 절 이후 더 이상 가드 조항에 대한 필요를)

, 당신은 다음과 같이 두 개의 절을 추가 할 수 있습니다 :

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

이 잘 속임수를 썼는지 사용하려고 오류 메시지를 반환 할 경우 ! 고맙습니다! –

+0

메시지를 무시하는 대신 오류를 반환 할 수 있습니까? –

+0

네,''body "=>" "'에 다른 절을 추가 할 수 있습니다. 나는 그것을 포함하도록 내 대답을 편집했습니다. – Dogbert

2

에게 당신을 @Dogbert가 제안한 대답을 사용할 수 있지만 문자열이 비어 있지 않은지 100 % 확신하려면 도우미 개인 기능에서 broadcast!을 감싸거나 if 또는 unless (음수이면) 표현식으로 감쌀 수 있습니다.

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

당신은 당신이 뭔가 더 복잡한 예 :

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

고마워요! @ 도버트 솔루션은 너무 간단합니다 ... 그래서 아직 실제로 오류 메시지를 반환하거나 그냥 그 메시지를 무시 해야하는지 아직 잘 모르겠지만, 원래는 실제로 당신의 솔루션과 같은 것을 찾고있었습니다. 너무 나쁘지 않아요. 둘 다 대단하다는 이유로 두 답을 모두 수락하십시오! –