2017-07-28 8 views
1

チャットアプリを作成していて、チャンネルメッセージがたくさんあります。ここにそのうちの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

はい、チャンネルでフェニックスビューを使用できます。ただMyView.renderを呼び出してください.... –

答えて

3

Phoenix Viewsは、機能を持つ通常のモジュールです。

あなたが直接これらの機能を呼び出すことができ、次のいずれか

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

またはあなたの視野のrender/2関数を呼び出しますPhoenix.View機能を使用します。あなたの場合Phoenix.View機能はいくつかの利点を持っている

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

を引数はより動的です(たとえば、メッセージとしてnilを渡す場合)。

これらの便利機能の詳細については、Phoenix.View documentationを参照してください。

大規模なアプリケーションを構築する場合は、メッセージ応答としてjsonを渡す必要があるため、メッセージキュー内のチャネルメッセージまたはシリアライズされたメッセージとして、すべてのモデルに.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

関連する問題