【发布时间】:2017-08-02 19:15:35
【问题描述】:
我正在尝试将更新保存到具有父级(状态)的记录(用户)。用户记录显示正常(在显示、编辑中),包括状态。用户记录可以根据自己的属性进行正常更新,但不会保留对用户选择的状态的任何更改。将用户状态从 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
我在这里做错了什么?我的变更集中是否遗漏了将参数中的 user_id 转换为变更集的内容?我希望我在做一些简单而愚蠢的事情——我真的花了好几个小时试图把这个分开,但我被困住了!
【问题讨论】: