在函数中映射参数

时间:2017-11-21 04:06:22

标签: elixir phoenix-framework

我正在学习灵药,有一件事我不明白你在地图中看到地图是功能论证的风格。你看到的最常见的地方是这样的控制器:

CONTROLLER
def create(conn, %{"league" => league_params}) do
  league = %League{}
    |> League.changeset(league_params)
    |> Repo.insert()

  case league do
    {:ok, league} ->
      conn
      |> put_flash(:info, "League Created Successfully.")
      |> redirect(to: page_path(conn, :index))
    {:error, %Ecto.Changeset{} = changeset} ->
      render(conn, "new.html", changeset: changeset)
  end
end

所以,create/2函数。第二个参数看起来像这个%{"league" => league_params}。如果我错了,请更正我,但这是一张地图,为什么我们引用League.changeset(league_params)下面的值而不是键League.changeset("league")

这可能看起来像一个愚蠢的问题,但我无法解决这个问题,我无法找到这个问题的文档。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在Map模式中,键是与地图的键匹配的值,值是将该键的值绑定到的模式。例如,模式%{"foo" => x}将成功与地图%{"foo" => 123}匹配,并且作为匹配的结果,变量x将绑定到123

同样,在您的示例中,league_params将绑定到params地图"league"键的值,这就是为什么league_params被传递给变更。代码几乎等同于在函数体中执行def create(conn, params)然后league_params = params["league"]。 (几乎因为如果值不存在,模式匹配将失败,但此代码会将league_params设置为nil。)