在变更集验证之前在哪里以及如何包装参数?

Where and How to wrap params before changeset validation?

之后的下一个困难,我试图传递到 %Geo.Point 函数包装的变更集坐标,在 Map.put 坐标键保持不可变,但目标问题是如何以及在哪里应该包裹坐标吗?我可以在模式处理中的某处执行此操作,或者在控制器中传递变更集或模型中的变更集方法之前更好吗?

def create(conn, %{"notify" => %{"coordinates" => %{"latitude" => latitude, "longitude" => longitude}} = notify_params}) do
  geo = %Geo.Point{coordinates: {latitude, longitude}}
  Map.put(notify_params, :coordinates, geo ) # coordinates are immutable
  changeset = Notify.changeset(%Notify{}, notify_params)
  #...
end

使用 Map.put(notify_params, :coordinates, geo) 可以,但是您没有绑定该值。

这会将 notify_params 变量重新绑定到您的新值。请注意,您应该使用 "coordinates" 而不是 :coordinates,因为参数使用字符串作为键。

notify_params = Map.put(notify_params, "coordinates", geo)

地图更新还有另一种(首选)语法,如果键不存在,该语法会出错。

notify_params = %{notify_params | "coordinates" => geo}