2017-02-09 12 views
1

私はEvernoteの個人用バージョンであるPhoenixアプリケーションで作業しています。私はBookモデルを持っています、そのhas_manyNoteレコード。has_many関係を持つPhoenixモデルは、関係を事前にロードせずに更新されません

これが私の本モデルである:

defmodule Notebook.Book do 
    use Notebook.Web, :model 

    schema "books" do 
    field :name, :string, default: "" 
    has_many :notes, Notebook.Note 
    belongs_to :user, Notebook.User 
    timestamps() 
    end 

    @doc """ 
    Book changeset. Name field required. 
    """ 
    def changeset(model, params \\ %{}) do 
    model 
    |> cast(params, [:name]) 
    |> validate_required(:name) 
    end 
end 

そして、私は私のコントローラで更新エンドポイントがあります。私は私のテストを実行すると

test "with a valid jwt", %{conn: conn, jwt: jwt} do 
    book = insert(:book) 
    resp = conn 
    |> put_req_header("authorization", "Bearer: #{jwt}") 
    |> put(book_path(Endpoint, :update, book, book: %{name: "New Book"})) 
    |> json_response(:ok) 

    assert resp["data"]["book"]["name"] == "New Book" 
end 

def update(conn, %{"id" => id, "book" => book_params}) do 
    existing_book = Repo.get(Book, id) 
    changeset = Book.changeset(existing_book, book_params) 

    case Repo.insert(changeset) do 
    {:ok, book} -> 
     conn 
     |> put_status(:ok) 
     |> render("show.json", book: book) 

    {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render("error.json", message: changeset.errors) 
    end 
end 

とテストを、私はこのエラーが表示されます:

** (RuntimeError) attempting to cast or change association `notes` from `Notebook.Book` that was not loaded. Please preload your associations before manipulating them through changesets 

私が送信しているパラメータはnameです。これを見て、私はrelated issueを見つけましたが、私はcast_assocを使用していないので、それは当てはまりません。

私がここで間違っていることを理解できません。私はEctoの関係を事前にロードすることについて理解していますが、この場合はNoteレコードを更新していないので、事前にロードする必要はありません。Bookレコードの1つのフィールドだけです。

レポ全体がhereです。

答えて

1

updateの方法でRepo.insertを使用しているようです。BookControllerです。それを修正するにはRepo.updateに修正する必要があります。

+0

ありがとうございます!私はしばらくこのことに固執していた。 –

関連する問題