親(状態)を持つレコード(ユーザー)への更新を保存しようとしています。ユーザーレコードには、状態を含めた詳細(表示、編集)が表示されます。ユーザレコードはそれ自身の属性であるとうまく更新されますが、ユーザによって選択された状態への変更は永続化されません。 1から2へのユーザの状態を変更する場合は、ユーザーのparamsは、ファインビューの外観からコントローラに戻った...ログから - >Ecto:親モデルに更新セットをドロップする
%{"email" => “[email protected]", "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をparamsからチェンジセットにキャストする私のチェンジセットに何かがありませんか?私は何かシンプルで愚かなことをやっていると思う - 私は本当に時間を費やして読んでこれを選び、私は立ち往生している!
ありがとうべきである - 私はすでに、フェニックスは、あなたがcast_assocを使用して関連付けをキャストする必要があると言って、その上でエラーをスローすることをしようとしました。私はreproと与えられた正確なエラーを取得します。しかし、それを試してみると、cast_assocが子どものためのものであると不平を言う別のエラーがスローされます。 –
私は間違っている、あなたは言ったように、今は完全に動作します。それが以前にはうまくいかなかった理由は考えられません(多分私はそこにassoc_constraintを持っていませんでした)。巨大なお元気ですか?あなたは私の一日を作った! –
私はそれを理解しました:私は以前に追加したと思います:state_idではなくcastに状態。私は、直観的ではなく、実際の列の規則(state vs state_id)に属しているのがわかります。私は正しいことをやっていると思う? –