在函数中映射参数

Bit*_*ise 2 elixir phoenix-framework

我正在学习长生不老药,有一件事我不明白你看到地图作为函数参数的风格。你看到的最常见的地方是在这样的控制器中:

控制器
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
Run Code Online (Sandbox Code Playgroud)

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

这似乎是一个愚蠢的问题,但我无法弄清楚这个问题,而且我找不到这个问题的文档。谢谢您的帮助。

Dog*_*ert 5

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

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