Ecto:changeset将更新删除到父模型

时间:2017-08-02 07:46:12

标签: phoenix-framework ecto

我正在尝试将更新保存到具有父(状态)的记录(用户)。用户记录显示正常(显示,编辑),包括状态。用户记录对其自身的属性进行了更新,但不会保留对用户所选状态的任何更改。当用户的状态从1更改为2时,用户参数从视图中返回控制器看起来很好...来自日志 - >

%{"email" => “e@e.com", "first_name" => “Abe",
"last_name" => “Sam", "password" => “foobar", "state_id" => "2"}

但是当这个传递给用户变更集时,它会返回对state_id的更改已删除...来自日志 - >

#Ecto.Changeset<action: nil,
changes: %{password: "foobar",
password_hash: “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx."},
errors: [], data: #SomeApp.User<>, valid?: true>

控制器中的更新是:

def update(conn, %{"id" => id, "user" => user_params}) do
  user = Repo.get!(User, id)
  changeset =  User.changeset(user, user_params)
  case Repo.update(changeset) do

...

相关的变更集代码为:

def changeset(model, params \\ %{}) do
    model
    |> cast(params, [:email, :first_name, :last_name, :password])
    |> assoc_constraint(:state)
    |> validate_required([:email, :first_name, :last_name, :password])
    |> unique_constraint(:email)
    |> validate_length(:password, min: 4, max: 100)
    |> put_pass_hash()
  end

用户的架构是:

schema "users" do
    field :email, :string
    field :password,  :string, virtual: true
    field :password_hash, :string
    field :first_name, :string
    field :last_name, :string
    belongs_to :state, SomeApp.State

    timestamps()
  end

我在这里做错了什么?我是否在我的变更集中遗漏了将params中的user_id强制转换为变更集的内容?我希望我做一些简单而愚蠢的事情 - 我真的花了好几个小时试图读取这个分开而且我被卡住了!

1 个答案:

答案 0 :(得分:1)

由于您要使用state_id中的params,因此您需要在:state_id的调用中将cast添加到允许的列表中。在允许列表中没有:state_id的情况下,该值将被忽略,这就是现在正在发生的事情。

|> cast(params, [:email, :first_name, :last_name, :password])

应该是

|> cast(params, [:email, :first_name, :last_name, :password, :state_id])