2017-07-07 13 views
0

私のPhoenixアプリケーションでは、ページングの状態を維持するためにGenserver(Paginator)を使用しています。Phoenix/Elixir - プロトコルPhoenix.Paramが#PIDに実装されていません<0.890.0>

私は私のPageControllerで、この持っている:私は、このリンクを持っている私のテンプレートindex.html.eexで

def index(conn, params) do 
    {page_entries, current_page} = case Map.get(params, "page_entries") do 
            nil -> 
            {:ok, page_entries} = Paginator.start_link() 
            {page_entries, 1} 
            page_entries -> 
            {page_entries, Map.get(params, "current_page")} 
           end 
    # do some stuff 
    render conn, "index.html", page_entries: page_entries, current_page: current_page 
end 

を:

link "Next→", to: page_path(@conn, :index, page_entries: @page_entries, current_page: @current_page+1) 

をしかし、私はこのエラーを取得する:

protocol Phoenix.Param not implemented for #PID<0.890.0> 

docsより:

By default, Phoenix implements this protocol for integers, binaries, atoms, maps and structs.

リンクを介してページにプロセスIDを送信するにはどうすればよいですか?クエリ文字列に表示されるプロセスデータなしで実行する方法はありますか?

+2

私はこれは一般的に悪い考えのように聞こえると思います。プロセスが停止するとどうなりますか?または、複数のマシンを持つ必要がある場合は、ネスト要求が別のマシンに送信されるとどうなりますか? – michalmuskala

答えて

1

PIDを渡すべきではありません。 PIDは長命のエンティティではなく、プロセスがクラッシュしてスーパーバイザによって再起動されたときに変更され、異なるノード間で異なります。代わりにnameまたはidを渡してください。

:あなただけの代わりに PIDのこの名前を渡し、この Paginatorのインスタンスを呼び出すために必要がある場合、後で

​​

GenServer.start_link/3は、1つの名前を渡すかもしれないオプションのoptsパラメータを持っています

GenServer.call(Paginator, {:blah, 42}) 
関連する問題