2017-07-28 55 views
1

我正在創建一個聊天應用程序,我有一堆頻道消息。以下是其中之一:藥劑/鳳凰:渠道的意見?

def handle_in("read", %{ "chat_id" => chat_id }, socket) do 
    user_id = socket.assigns[:id] 

    ts = DateTime.utc_now 
    case ChatManager.mark_as_read({user_id, chat_id, ts}) do 
    {:ok, chat_user} -> 
     last_read_at_unix = chat_user.last_read_at |> TimeConverter.ecto_to_unix 
     {:reply, {:ok, %{ chat_id: chat_id, last_read_at: last_read_at_unix }}, socket} 
    {:error, changeset} -> 
     {:reply, {:error, %{errors: changeset.errors}}, socket} 
    end 
end 

我可以使用phoenix Views來分離我的演示/響應邏輯嗎?這樣我就可以快速轉到視圖文件並查看每條消息返回的內容。

+1

是的,您可以在您的頻道中使用Phoenix視圖。只需調用MyView.render .... –

回答

3

鳳凰視圖只是普通模塊的功能。

您可以直接調用這些函數:

MyApp.Web.ChatView.render("message.json", %{message: my_message}) 

或者使用Phoenix.View功能,將調用視圖的render/2功能:

Phoenix.View.render_one(MyApp.Web.ChatView, "message.json", message: my_message) 

Phoenix.View功能有一些優勢,如果你的參數更具動態性(例如,如果您通過nil作爲消息)。

有關這些便利功能的詳細信息,請參閱Phoenix.View documentation

在構建大型應用程序時,爲所有模型設置.json模板是有意義的,因爲您需要在API響應中傳遞json作爲通道消息或消息隊列中的序列化消息。您已經編寫的視圖可以重用於所有這些情況。

+1

只需注意,使用'Phoenix.View.render/3'將返回一個像{:safe,binary_data}'這樣的元組,您不能直接將其傳送到客戶端。如果您想要直接輸出,請使用'Phoenix.View.render_to_string/3'或'Phoenix.View.render_to_iodata/3'。 – vfsoraki

+0

好注意,雖然在渲染json時我沒有觀察到這種行爲。 – narrowtux

+0

我認爲在視圖中使用'render'很好,但是當你需要原始字符串時,你應該知道這一點。雖然我不確定。 – vfsoraki