2016-09-15 5 views
2

をチェンジチェンジセットに渡し、エラーを確認してください。だから私は(エイリアシング後)でした:私は、その後など、belongs_to持っていたモデルは、cast_assocで働いていたと思ったので、私は、関数名を変更しキャストエラーは私がチェンジを使用している間に問題を抱えている(チャットルーム用)以下のモデルを持っている

iex(4)> c = Room.changeset(%Room{}, %{}) 
** (RuntimeError) casting assocs with cast/3 is not supported, use cast_assoc/3 instead 
     (ecto) lib/ecto/changeset.ex:440: Ecto.Changeset.type!/2 
     (ecto) lib/ecto/changeset.ex:415: Ecto.Changeset.process_param/8 
    (elixir) lib/enum.ex:1151: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3 
    (elixir) lib/enum.ex:1151: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3 
     (ecto) lib/ecto/changeset.ex:391: Ecto.Changeset.do_cast/7 
    (tx_chat) web/models/room.ex:19: Elemental.TxChat.Room.changeset/2 

。現在:

iex(4)> c = Room.changeset(%Room{}, %{}) 
** (FunctionClauseError) no function clause matching in Ecto.Changeset.cast_assoc/3 
     (ecto) lib/ecto/changeset.ex:518: Ecto.Changeset.cast_assoc(%Elemental.TxChat.Room{__meta__: #Ecto.Schema.Metadata<:built, "rooms">, created_by: #Ecto.Association.NotLoaded<association :created_by is not loaded>, created_by_id: nil, created_from_app: nil, id: nil, inserted_at: nil, members: #Ecto.Association.NotLoaded<association :members is not loaded>, name: nil, updated_at: nil}, %{}, [:name, :created_by, :created_from_app]) 
    (tx_chat) web/models/room.ex:19: Elemental.TxChat.Room.changeset/2 

私は間違っていますか?

+2

あなただけcast_assoc' 'へ' cast'を変更しましたか? '|> cast(params、[:name、:created_from_app])|> cast_assoc(:created_by)'を試してください。 – Dogbert

+0

それがうまくいくかどうか教えてください。私は解説付きの回答を投稿します。 – Dogbert

+0

@Dogbertそれは謎が何だったのです!私は実際には単に 'cast'を' cast_assoc'に置き換えるだけで十分馬鹿でした。毎回私を助けてくれてありがとう、ありがとう。 。 。心から感謝する。回答を投稿して説明してください。 – dotslash

答えて

4

コメントで明らかになったように、既存のユーザーを新しいルームに関連付ける必要があります。これは、castに渡されたフィールドのリストにcreated_by_idを追加して、assoc_constraint(:created_by)とし、created_by_idからRoom.changeset/2にユーザーのIDを送信することで、これを行うことができます。これは動作するはずです:

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:name, :created_by_id, :created_from_app]) 
    |> validate_required([:name, :created_by_id, :created_from_app]) 
    |> assoc_constraint(:created_by) 
end 

そしてのルームを作成するには:

Room.changeset(%Room{}, %{name: "foo", created_by_id: 1, created_from_app: 1}) 
|> Repo.insert 
関連する問題