我有一个在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
答案 0 :(得分:1)
我认为你的路线相互矛盾。通过以这种方式使用resources
,您将创建一条路径,该路径期望将ID附加到路径的末尾。即DELETE /api/auth/3
。
您可以通过正常的DELETE /api/auth
或DELETE /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控制器中的注销功能。