我正在学习灵药,有一件事我不明白你在地图中看到地图是功能论证的风格。你看到的最常见的地方是这样的控制器:
CONTROLLERdef 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")
?
这可能看起来像一个愚蠢的问题,但我无法解决这个问题,我无法找到这个问题的文档。谢谢你的帮助。
答案 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
。)