Phoenix模板如何管理状态?

时间:2018-02-10 16:07:19

标签: model-view-controller elixir phoenix-framework

我正在Elixir的纸牌游戏中工作,游戏的状态由GenServer管理。当用户导航到" games / new"我在GameController#new action中添加了一行来启动GenServer并返回初始化状态。然后我可以通过调用render来将这个状态传递给模板。

def new(conn, _params) do
    changeset =
      conn.assigns[:current_user]
      |> Ecto.build_assoc(:games)
      |> GamePlay.change_game()

      War.GamePlay.Game.start_game()

      %War.GamePlay.Game{user_cards: user_hand, computer_cards: comp_hand, status: status} =
        Server.read(War.GamePlay.Server)
    render(conn, "new.html", changeset: changeset, user_hand: user_hand, comp_hand: comp_hand, status: status)
  end

在我的模板中,我可以使用这些变量来抓住状态,

<h4>  Game Status:  <%= @status %> </h4>

它将返回&#34;正在进行中&#34;。

我不希望用户离开页面,但我如何从视图中调用GenServer?例如,在战争游戏中,用户需要点击&#34; next card&#34;,这是如何与GenServer绑定的,以便按钮调用该功能?如何将当前状态传递给模板?

1 个答案:

答案 0 :(得分:1)

呈现视图后,您再也无法调用GenServer。在这种情况下,您可能希望使用channels。这样您就可以继续在客户端上执行某些操作时调用GenServer