【问题标题】:Elixir/Phoenix calling update action from nestedElixir/Phoenix 从嵌套调用更新操作
【发布时间】:2016-08-06 18:09:45
【问题描述】:

我有自动生成的订单和 order_items 控制器和模型。

我的路由器是这样的:
resources "/orders", OrderController do
  resources "/order_items", OrderItemController
end

在订单 show.html 页面上,我调用了不同的 order_item 操作。我可以创建和删除将它与订单关联的 order_item:

<%= 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 %>

但是,如果我尝试调用更新操作(不是来自 order_item 的 edit.html,而是来自 order 的 show.html,如上面的创建/删除),它会返回以下错误:

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

嗯,我知道方法应该是PUT(用于更新),但如果我使用链接使用method: "put"

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

仍然无法使其工作。我可以调用创建和删除,但不能从订单的 show.html 更新操作,这对我来说似乎很奇怪。更重要的是,我可以从 order_item edit.html 页面调用 update 并且它运行良好。我究竟做错了什么?已经为此苦苦挣扎了一段时间。

提前致谢!

编辑:我在 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

结束

错误

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>

【问题讨论】:

  • method: "put" 时出现什么错误?另请注意,该代码中存在语法错误(也许您在此处发布之前已更改?)。
  • 嘿@Dogbert,对不起,我修正了语法。至于错误,我得到“No helper clause for Pos1.Router.Helpers.order_order_item_path defined for action :update with arity 3. 请检查函数、arity 和 action 是否正确。”
  • 啊,试试method: :patch吧。
  • 使用方法: :patch 不幸得到与使用方法相同的错误: :put
  • 您可以发布该错误的堆栈跟踪吗?您不会在您发布的代码中的任何位置使用:update 调用order_order_item_path,总共有3 个参数。另外,请尝试在您的代码库中搜索对具有 3 个参数的该函数的调用。

标签: post elixir phoenix-framework


【解决方案1】:

您在对 order_order_item_path 的调用中缺少一个参数。

这个:

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

应该是:

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

【讨论】:

  • 谢谢@Dogbert!该死,我怎么错过了。但刚刚测试,它的工作原理。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多