2016-08-06 17 views
0

Ich habe Aufträge und Order_items Controller und Modelle automatisch generiert. Elixir/Phoenix Aufruf Update-Aktion von verschachtelten

sieht Mein Router wie folgt aus:

resources "/orders", OrderController do 
    resources "/order_items", OrderItemController 
end 

auf der Seite, um show.html ich verschiedene ORDER_ITEM Aktionen aufrufen werde. Ich erstellen und löschen ORDER_ITEM es mit Ordnung assoziieren:

<%= render Pos1.OrderItemView, "item_quantity.html", changeset: @order_item_changeset, action: order_order_item_path(@conn, :create, @order) %> 
<%= link "delete", to: order_order_item_path(@conn, :delete, @order, @order_item), method: :delete %> 

Allerdings, wenn ich versuche, Update-Aktion aufzurufen (nicht von edit.html von ORDER_ITEM, aber show.html der Ordnung, wie erstellen/löschen oben) kehrt folgende Fehlermeldung:

no route found for POST /orders/53/order_items/62 (Pos1.Router) 

Nun, ich verstehe, dass die Methode soll (für Update) gesetzt werden, aber wenn ich Link verwenden method: "put"

<%= link "+", to: order_order_item_path(@conn, :update, @order, @order_item), method: "put" %> 

Noch verwenden, kann nicht machen es funktioniert. Es scheint mir komisch, dass ich create und delete, aber nicht update action von der show.html der Bestellung aufrufen kann. Außerdem kann ich update von der Seite order_item edit.html aufrufen und es funktioniert einwandfrei. Was mache ich falsch? Habe damit eine Weile gekämpft.

Vielen Dank im Voraus!

Edit: Meine Update-Aktion von ORDER_ITEM:

def update(conn, %{"id" => id}) do 
order_item = Repo.get!(OrderItem, id) 
order = Repo.get!(Order, order_item.order_id) 
changeset = OrderItem.changeset(order_item, %{quantity: order_item.quantity + 1}) 

case Repo.update(changeset) do 
    {:ok, order_item} -> 

    conn 
    |> put_flash(:info, "Order item quantity increased successfully.") 
    |> redirect(to: table_order_path(conn, :show, order.table, order)) 
    {:error, _changeset} -> 
    conn 
    |> put_flash(:error, "Failed to increase order item!") 
    |> redirect(to: table_order_path(conn, :show, order.table, order)) 
end 

Ende

Fehler: enter image description here

Order_item.html.eex:

<tr> 
    <td><%= @order_item.food.name %></td> 
    <td><%= @order_item.quantity %></td> 
    <td><%= link "+", to: order_order_item_path(@conn, :update, @order_item), method: :put %></td> 
    <td><%= link "-", to: order_order_item_path(@conn, :delete, @order, @order_item), method: :delete, class: "btn btn-danger btn-xs" %> </td> 
</tr> 
+0

Was ist der Fehler, wenn Sie Methode tun ': "put"'? Beachten Sie auch, dass es in diesem Code einen Syntaxfehler gibt (vielleicht haben Sie vor dem Posten hier geändert?). – Dogbert

+0

Hey @Dogbert, Sorry, ich habe die Syntax korrigiert. Was den Fehler betrifft, bekomme ich "No Helper-Klausel für Pos1.Router.Helpers.order_order_item_path für Aktion definiert: Update mit Arity 3. Bitte überprüfen Sie, dass die Funktion, Arity und Aktion korrekt sind." – Ilya

+0

Ah, probiere stattdessen "method:: patch". – Dogbert

Antwort

1

Sie vermissen ein Argument im Aufruf an order_order_item_path. Diese

:

<td><%= link "+", to: order_order_item_path(@conn, :update, @order_item), method: :put %></td> 

sollte sein:

<td><%= link "+", to: order_order_item_path(@conn, :update, @order, @order_item), method: :put %></td> 
+0

Danke @Dogbert! Verdammt, wie kommt es, dass ich das verpasst habe? Aber gerade getestet, es funktioniert. Haben Sie einen guten Tag! – Ilya