Phoenix JSON API - 配置路由以在控制器中调用正确的函数

时间:2017-06-21 13:48:36

标签: elixir phoenix-framework

我有一个在Phoenix应用程序中创建的注销系统,其中注销按钮位于Phoenix模板中,如下面的三个代码片段所示。这很好。

Phoenix模板: /web/templates/layout/app.html.eex

<%= link "Logout", to: auth_path(@conn, :delete), method: :delete, class: "btn btn-danger" %>

Phoenix Routes: /web/router.ex

相关路线是删除路线。

scope "/auth", AdminApi do
  pipe_through :browser

  get "/:provider", AuthController, :index
  get "/:provider/callback", AuthController, :callback
  delete "/logout", AuthController, :delete
end

Phoenix控制器: /web/controllers/auth_controller.ex

def delete(conn, _params) do
  conn
  |> put_flash(:info, "You have been logged out!")
  |> configure_session(drop: true)
  |> redirect(to: "/")
end

我正在尝试实现相同的功能,但使用单独的前端并使用Phoenix作为JSON API。

这个想法是前端向相关API端点发出AJAX DELETE请求,然后该路由捕获该调用并在 auth_controller 中触发delete函数。

如何配置路由,以便它将触发控制器中的相关功能?

PS我确定这不是CORS问题,因为CORS插件适用于其他路由,例如“/ auth /:provider”

以下是我到目前为止:

来自前端的AJAX请求

var url = ENV.apiProtocol + ENV.apiHost + "/api/auth";
Ember.$.ajax({
    url : url,
    type: "DELETE",
  success: function(response){
    console.log(response)
  },
  error: function(response) {
    console.log(response)
  }
});

凤凰城路线: /web/router.ex

scope "/api", AdminApi do
    pipe_through: api

    resources "/auth/:provider", AuthController, except: [:new, :edit]
    resources "/auth", AuthController, except: [:new, :edit]

end

Phoenix控制器: /web/controllers/auth_controller.ex

def delete(conn, _params) do
  conn
  |> put_flash(:info, "You have been logged out!")
  |> configure_session(drop: true)
  |> redirect(to: "/")
end

2 个答案:

答案 0 :(得分:1)

我认为你的路线相互矛盾。通过以这种方式使用resources,您将创建一条路径,该路径期望将ID附加到路径的末尾。即DELETE /api/auth/3

您可以通过正常的DELETE /api/authDELETE /api/session路线获益,其中您传递的令牌表示您想要销毁其会话的用户。

答案 1 :(得分:0)

我找到了解决方案。我在路由中定义了一个资源,所以Phoenix希望对端点/api/auth:id发出DELETE请求。

web / router.ex 中,我更改了

resources "/auth", AuthController, except: [:new, :edit]

delete "auth/logout", AuthController, :delete

现在,对端点/api/auth/logout的AJAX DELETE请求会激活auth控制器中的注销功能。