0
私は、次のエラーメッセージが出てい私のMYDBアプリでbook
を編集しよう:フェニックスのモデルの関係を更新するには?
/web/models/book.ex
defmodule MyDb.Book do
use MyDb.Web, :model
schema "books" do
field :title, :string
field :note, :string
many_to_many :people, MyDb.Person, join_through: MyDb.BookPerson
timestamps()
end
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:title, :note])
|> put_assoc(:people, parse_people_ids(params))
end
defp parse_people_ids(params) do
(params["people_ids"] || [])
|> Enum.map(&get_people/1)
end
defp get_people(id) do
MyDb.Repo.get_by(MyDb.Person, id: id)
end
end
I:ここでyou are attempting to change relation :people of MyDb.Book, but there is missing data.
は、関連するスニペットですがこのチェンジセットとの関係を保存することができます。
/web/controllers/book_controller.ex
def edit(conn, %{"id" => id}) do
book = Repo.get!(Book, id)|> Repo.preload(:people)
people = Repo.all(Person) |> Enum.map(&{&1.surname, &1.id})
changeset = Book.changeset(book)
render(conn, "edit.html", book: book, changeset: changeset, conn: conn, people: people)
end
def update(conn, %{"id" => id, "book" => book_params}) do
book = Repo.get!(Book, id)
changeset = Book.changeset(book, book_params)
case Repo.update(changeset) do
{:ok, book} ->
conn
|> put_flash(:info, "Book updated successfully.")
|> redirect(to: book_path(conn, :show, book))
{:error, changeset} ->
render(conn, "edit.html", book: book, changeset: changeset)
end
end
/web/templates/book/form.html.eex
<div class="form-group">
<%= label f, "Authors", class: "control-label" %>
<%= multiple_select f, :people_ids, @people, class: "form-control" %>
<%= error_tag f, :person_id %>
</div>
エラーメッセージの下のコメントは、私は既存のエントリを更新したいが、私はできれば、私はデータと一緒にエントリの主キー(ID)を含むべきであると言いますどうやったらどうなるのか理解していない。