2017-07-07 32 views
0

在我的Phoenix应用程序中,我使用的是Genserver(Paginator)来维护分页目的的状态。Phoenix/Elixir - 协议Phoenix.Param未实施#PID <0.890.0>

我有这个在我的PageController:

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 

在我的模板index.html.eex我有此链接:

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

您不应该通过PIDPID不是一个长期存在的实体,当进程崩溃并且由管理员重启时它会改变,它在不同的节点中是不同的。改为传递nameid

GenServer.start_link/3有一个可选的opts参数,其中一个可能传递了一个名字:

​​

后来,当你需要调用这个Paginator的情况下,只是通过这个名字来代替PID

GenServer.call(Paginator, {:blah, 42})