我正在尝试将更新保存到具有父(状态)的记录(用户)。用户记录显示正常(显示,编辑),包括状态。用户记录对其自身的属性进行了更新,但不会保留对用户所选状态的任何更改。当用户的状态从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强制转换为变更集的内容?我希望我做一些简单而愚蠢的事情 - 我真的花了好几个小时试图读取这个分开而且我被卡住了!
答案 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])