如何在Phoenix Controller中触发更新操作?

时间:2017-12-01 09:18:49

标签: api elixir phoenix-framework

在我使用的update测试中:

%{resp_body: body} = conn
|> sign_in
|> patch(asset_path(conn, :update), Poison.encode!(payload))

我收到此错误:

 ** (ArgumentError) No action :update for helper Web.Router.Helpers.asset_path/2. The following actions/clauses are supported:

     asset_path(conn_or_endpoint, :create, , opts \\ [])
     asset_path(conn_or_endpoint, :delete, id, opts \\ [])
     asset_path(conn_or_endpoint, :edit, id, opts \\ [])
     asset_path(conn_or_endpoint, :index, , opts \\ [])
     asset_path(conn_or_endpoint, :new, , opts \\ [])
     asset_path(conn_or_endpoint, :show, id, opts \\ [])
     asset_path(conn_or_endpoint, :update, id, opts \\ [])
 code: |> post(asset_path(conn, :update), Poison.encode!(payload))
 stacktrace:
   (phoenix) lib/phoenix/router/helpers.ex:299: Phoenix.Router.Helpers.raise_route_error/5
   test/controllers/asset_controller_test.exs:167: (test)

当我使用Postman直接测试时,它可以正常工作。

我在post(asset_path(conn, :create), Poison.encode!(payload))操作中使用了insert,它运行正常。

这是邮递员的快照,表明代码工作正常,测试失败。

enter image description here

2 个答案:

答案 0 :(得分:2)

update路由以及asset_path update操作需要资源的ID。您需要将其作为asset_path的第三个参数传递,例如

|> patch(asset_path(conn, :update, id), Poison.encode!(payload))

id应该是您尝试更新的记录的id

答案 1 :(得分:0)

您可以输入 mix phx.routes 进行检查。更新操作始终需要id才能工作。所以传递id,它应该工作