首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新位置cast_coordinate引发参数错误

更新位置cast_coordinate引发参数错误
EN

Stack Overflow用户
提问于 2021-10-22 09:09:28
回答 1查看 24关注 0票数 0

我有一个保存用户latitudelongitudelocations表。我正在使用带有扩展的Postgres/Postgis 13来生成坐标。下面是我的模型:

代码语言:javascript
复制
  schema "locations" do
    field :latitude, :float
    field :longitude, :float
    field :context, :string
    field :publish, :boolean
    field :coordinates, Geo.PostGIS.Geometry
    belongs_to(:user, User)

    timestamps()
  end

  @doc false
  def changeset(location, attrs) do
    location
    |> cast(attrs, [:user_id, :context, :longitude, :latitude, :publish])
    |> validate_required([:user_id, :context, :longitude, :latitude])
    |> cast_coordinates()
  end

  @spec cast_coordinates(Ecto.Changeset.t()) :: Ecto.Changeset.t()
  def cast_coordinates(changeset) do
    IO.inspect(changeset)
    lat = get_change(changeset, :latitude)
    lng = get_change(changeset, :longitude)
    geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
    changeset |> put_change(:coordinates, geo)
  end

when I create_location

代码语言:javascript
复制
  def create_location(attrs \\ %{}) do
    IO.inspect(attrs)
    %Location{}
    |> Location.changeset(attrs)
    |> Repo.insert()
  end

一切都很顺利。cast_coordinates中的changeset为:

代码语言:javascript
复制
cast coordinate
#Ecto.Changeset<
  action: nil,
  changes: %{
    context: "sss shop",
    latitude: 38.115556,
    longitude: 13.361389,
    profile_id: 5,
    publish: true,
    user_id: 2
  },
  errors: [],
  data: #OkBackend.Gis.ProfileLocation<>,
  valid?: true
>

但是当我update_location的时候

代码语言:javascript
复制
  def update_location(%Location{} = location, attrs) do
    location
    |> Location.changeset(attrs)
    |> Repo.update()
  end

不知何故,我的cast_coordinate抛出了argument error,因为changeset是:

代码语言:javascript
复制
#Ecto.Changeset<action: nil, changes: %{}, errors: [],


 data: #OkBackend.Gis.ProfileLocation<>, valid?: true>

正如您所看到的,changes中没有任何内容。

为什么会这样呢?我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2021-10-24 14:20:08

我认为这可能是因为在您的cast_coordinates函数中,您正在使用get_change(changeset, :longitude)

这将得到一个指向longitude字段的change,但是如果您不更改该字段,那么它将返回nil

相反,您应该使用get_field(changeset, :longitude)来获取更改后的经度或现有的经度(如果它没有更改),如下所示:

代码语言:javascript
复制
  @spec cast_coordinates(Ecto.Changeset.t()) :: Ecto.Changeset.t()
  def cast_coordinates(changeset) do
    lat = get_field(changeset, :latitude)
    lng = get_field(changeset, :longitude)
    geo = %Geo.Point{coordinates: {lng, lat}, srid: 4326}
    changeset |> put_change(:coordinates, geo)
  end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69674264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档