在变更集验证之前在哪里以及如何包装参数?
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}
%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}