在Ecto变更集中的空原子

Ell*_*son 12 elixir ecto

为什么在Ecto changeset方法中将params设置为默认:empty原子?例如

def changeset(user, params \\ :empty) do
   ...
Run Code Online (Sandbox Code Playgroud)

这是否允许您使用nil为变量调用changeset方法?

Rya*_*igg 18

这在Phoenix编程中有解释:

克里斯说:如果没有指定参数,我们不能只默认为空地图,因为这与空白表单提交无法区分.相反,我们默认params到原子:空.按照惯例,Ecto将生成一个无效的变更集,其中包含空参数.

因此:empty用作占位符,以便我们可以区分空白表单提交和未指定参数.


正如Stefan在下面的评论中指出:

请注意,使用Ecto 2.0时,它使用空地图: def changeset(user, params \\ %{}) do

  • 请注意,使用Ecto 2.0时,它使用空映射:`def changeset(user,params \\%{})do`.请参阅https://hexdocs.pm/ecto/2.0.2/Ecto.Changeset.html (8认同)
  • 使用Ecto 2.2.8,传递`:empty`现在会导致`Ecto.CastError`.但是,%{}`完美无缺. (3认同)