2017-04-20 52 views
1

我希望能夠通過phoenix presence中的:meta地圖將用戶元數據傳遞到JavaScript端來訪問它。更具體地說,我希望能夠推送圖像文件路徑(字符串),並讓它們與我在場列表中的每個用戶相關聯。該文檔提供了這個例子重寫讀取/ 2功能,用戶模型數據添加到:meta地圖: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 

然而,當我爲我的用戶模型進行相應的修改,我得到關於可變誤差u和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宏。您不必在控制器和模型中執行此操作,因爲在您使用MyApp.Web,控制器時,它已經在web.ex中設置了。 –

回答

0

您需要導入Ecto.Query才能使用from宏。這是在您的web.ex文件中完成的,因此當您使用use MyApp.Web, :controller時,您可以通過中的quote塊進行導入。但是,您需要在其他模塊中手動執行此操作。

以下添加到您的光臨模塊的頂部像這樣

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

我發現我的問題是什麼。基本上,我的應用程序中的metas地圖並不總是以我想要的值填充。在這種情況下,它內部並不總是有user.id。很明顯,當用戶加入頻道時,獲取函數至少被調用4次。如果我檢查取功能的entries map在其上運行Map.keys後,它返回:

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

因此,在兩頭在外的四個實例,其中取功能基本上被調用,我的頻道應用程序正在返回的2個空值鍵,當這些空值被放入查詢時,它會導致錯誤。

不幸的是,這意味着應用程序中的某個地方出現了一個錯誤,導致將此空值傳遞給我的提取函數;很可能在JavaScript或我的頻道模塊中。

我將不得不從頭開始重建這個應用程序,所以我想這意味着這個問題是關閉的。另外,我可以用一個警戒或模式匹配語句的形式來進行一些錯誤處理,以防止這些空值,但我認爲從長遠來看,如果我只是重新啓動會更好。