Я закончил читать Создание API GraphQL в Эликсире с Абсентом (Pragprog) , и я пытаюсь расширить item_controller.ex, чтобы разрешить редактирование «пунктов меню».
I сделали эти функции в контроллере:
@graphql """
query ($id: ID!) {
menu_item(id: $id) @put {
name
description
}
}
"""
def edit(conn, %{data: %{menu_item: item}}) do
render(conn, "edit.html", item: item)
end
@graphql """
mutation UpdateMenuItem($id: ID!, $input: MenuItemInput!) {
updatedMenuItem: updateMenuItem(id: $id, input: $input) {
errors { key message }
menuItem {
name
description
price
}
}
}
"""
def update(conn, %{data: %{menu_item: _}}) do
conn
|> redirect(to: "/admin/items")
end
def update(conn, %{errors: errors}) do
conn
|> put_flash(:info, Enum.reduce(errors, "", fn e, a -> a <> e.message end))
|> redirect(to: "/admin/items")
end
Вот мое редактирование. html .eex:
<%= render "form.html",
Map.put(assigns, :action,
Routes.item_path(@conn, :update, @item)) %>
Вот моя форма. html .eex:
<%= form_for @conn, @action, [method: :put, as: :input], fn f -> %>
<div class="form-group">
<label for="description">Description</label>
<input type="string" id="description" as="description" name="description" value="<%= @item.description %>"/>
<label for="price">price</label>
<input type="string" id="price" name="price" value="<%= @item.price %>"/>
<label for="name">name</label>
<input type="string" id="name" name="name" value="<%= @item.name %>"/>
<label for="category">category</label>
<input type="string" id="category" name="categoryId" value="<%= @item.category_id %>"/>
</div>
<%= submit "Update", class: "btn btn-primary" %>
<% end %>
Но при отправке формы я получаю сообщение об ошибке. Это ошибка:
In argument "input": Expected type "MenuItemInput!", found null.
Variable "input": Expected non-null, found null.
Мне это имеет смысл. Я мог бы, например, изменить атрибут name любого из входных элементов в form. html .eex на «input», и тогда я бы получил другую ошибку:
Argument "input" has invalid value $input.
Опять же, это делает смысл для меня. Аргумент $ input не является переменной MenuItemInput.
Итак, я ищу подход к этому одним из двух возможных способов:
В форме. html. например, я создаю «форму внутри формы», чтобы у нее было поле «ввода», которое, в свою очередь, имеет несколько полей. Может быть, «группа ввода»?
В item_controller я передаю переменные в атрибут модуля @graphql. Я просто не знаю, как это сделать. Я экспериментировал со множеством странного синтаксиса, потому что я даже не могу найти примеры SDL, в которых есть встроенные переменные.
Любые советы / критика / идеи очень приветствуются. Я уверен, что это сделал кто-то другой, потому что это кажется естественным попыткой после прочтения книги.