2017-04-20 13 views
1

:meta 맵을 통해 사용자 메타 데이터를 phoenix에 전달하여 JavaScript 측에서 액세스 할 수 있기를 원합니다. 더 구체적으로 말하면 이미지 파일 경로 (문자열)를 푸시하고 내 현재 목록의 각 사용자와 연결되도록 할 수 있습니다. 문서는이 :meta지도에 사용자의 모델 데이터를 추가/2 기능을 가져 오버라이드 (override)이 예이다 : 오류 변수에 대한 내 사용자 모델에 대한 적절한 변경을 할 때phoenix presence fetch/2 override

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 

그러나, 내가 할 유와 from/2 함수뿐만 아니라 cannot use ^Map.keys(entries) outside of match clauses.

나는 비슷한 일을하려고하는 사람들의 예를 찾고 여기에서 시도한 것과 비슷한 github에서 아무것도 찾을 수 없습니다.

누구나 내가 제대로 작동 할 수 있도록 fetch/2 기능을 재구성하는 방법에 대해 알 수 있습니까? 나는 3 개의 필드, 전자 메일, 암호 및 아이콘/아바타 이미지가있는 기본 사용자 모델을 가지고 있습니다.

+0

파일 상단에'require Ecto.Query'를 입력하십시오. 파일을 요구하지 않았을 때의 오류는 일반적인 오류입니다. 또한'Ecto.Query'를 가져 왔는지 확인하십시오. –

+0

편집 : naw, 오류 코드는 변경되지 않았습니다. 여전히 경고 : 변수 "u"가 존재하지 않고 "u()"로 확장 중입니다. 괄호를 사용하여 모호성을 제거하거나 변수 이름을 기본 경고로 변경하고 수동으로 입력하면 다른 변수를 변경하십시오. Ecto.Query와 내 사용자 모델을 요구 한 후에도 repl에 추가 할 수 있습니다. – Abeltensor

+0

'from'은 Ecto.Query 매크로입니다. 예를 들어'use MyApp.Web, : controller'을 사용하면 web.ex에 이미 설정되어 있기 때문에 컨트롤러와 모델에서이 작업을 수행 할 필요가 없습니다. –

답변

0

from 매크로를 사용하려면 Ecto.Query을 가져와야합니다. 이것은 web.ex 파일에서 이루어 지므로, use MyApp.Web, :controller 일 때, quote 블록을 통해 web.ex 블록으로 가져 왔습니다. 그러나 다른 모듈에서 수동으로이 작업을 수행해야합니다.

는 내 문제가 무엇인지 발견이

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

처럼 당신의 존재 모듈의 맨 위에 다음을 추가합니다. 기본적으로 내 응용 프로그램의 metas 맵은 항상 원하는 값으로 채워지지 않습니다. 이 경우 항상 내부에 user.id이있는 것은 아닙니다. 분명히 사용자가 채널에 참여하면 가져 오기 기능이 적어도 4 번 호출됩니다. 나는 그것을 Map.keys를 실행 한 후 함수의 entries map를 가져 점검 경우, 반환 : 그러니까 기본적 기능을 가져 네 개의 인스턴스 중 두 가지에

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

을 내 채널 앱이 2 개 빈 값을 반환 호출되고 키와 빈 값을 쿼리에 넣으면 오류가 발생합니다.

불행히도이 값은 응용 프로그램에서이 빈 값을 내 페치 함수에 전달하는 데 오류가 있다는 것을 의미합니다. 자바 스크립트 또는 내 채널 모듈에서 가장 가능성이 높습니다.

이 응용 프로그램을 처음부터 다시 빌드해야 할 것입니다. 그래서이 질문이 닫혔다는 의미입니다. 또는, 빈 값에 대해 보호하기 위해 가드 또는 패턴 일치 구문의 형태로 오류 처리를 넣을 수도 있지만, 방금 다시 시작하면 장기적으로 더 좋을 것이라고 생각합니다.