2017-04-20 4 views
1

:metaマップを使ってユーザーのメタデータをphoenixの存在下で渡して、JavaScript側からアクセスできるようにします。具体的には、画像ファイルのパス(文字列)をプッシュして、自分のプレゼンスリスト内の各ユーザーに関連付けることができます。ドキュメントは:metaマップにUserモデルのデータを追加するためのフェッチ/ 2機能をオーバーライドするために、この例を示します:フェニックス存在フェッチ/ 2オーバーライド

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です。

私は似たようなことをしようとしている人の例を探していましたが、私がここで試しているのと同じようなギターで何かを見つけることができませんでした。

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があるとは限りません。どうやら、ユーザーがチャンネルに参加すると、fetch関数が少なくとも4回呼び出されます。私はそれでMap.keysを実行した後に、関数のentries mapをフェッチ調べると、それが返されます。したがって、基本的機能をフェッチ4つのインスタンスのうち2で

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

を、私のチャンネルアプリは2つの空の値を返していると呼ばれていますこれらの空の値がクエリに入力されると、エラーが発生します。

残念ながら、これは、この空の値をmy fetch関数に渡す原因となるアプリケーション内のどこかにエラーがあることを意味します。 JavaScriptまたはマイチャンネルのモジュールで使用されています。

私はこのアプリケーションをゼロから再構築する必要があるので、この質問は閉じられていると思います。あるいは、これらの空の値から保護するために、ガードまたはパターンマッチングステートメントの形式でエラー処理を行うこともできますが、再起動すれば長期的には改善すると思います。

関連する問題