Elixir 长生不老药/凤凰:频道视图?

Elixir 长生不老药/凤凰:频道视图?,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在创建一个聊天应用程序,我有一大堆频道信息。以下是其中之一: 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_

我正在创建一个聊天应用程序,我有一大堆频道信息。以下是其中之一:

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视图分离我的演示/响应逻辑吗?这样,我可以快速转到视图文件,查看每条消息返回的内容。

Phoenix视图只是普通模块,其中包含函数

您可以直接调用这些函数:

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)
如果参数更具动态性(例如,如果将
nil
作为消息传递),那么
Phoenix.View
函数有一些优势

有关这些便利功能的详细信息,请参阅


在构建大型应用程序时,为所有模型提供
.json
模板是有意义的,因为您需要在API响应中传递json,作为通道消息或消息队列中的序列化消息。您已经编写的视图可用于所有这些情况。

是的,您可以在频道中使用Phoenix视图。只需调用MyView.render…只需一个注释,使用
Phoenix.View.render/3
返回一个类似
{:safe,binary_data}
的元组,您不能直接将其导入客户端。如果您想要直接输出,请使用
Phoenix.View.render_to_string/3
Phoenix.View.render_to_iodata/3
。值得注意的是,虽然我在呈现json时没有观察到这种行为。我认为在视图中使用
render
是可以的,但当您需要原始字符串时,您应该知道这一点。不过我不确定。