Phoenix 框架插件内的重定向

Redirection inside a plug in Phoenix framework

我正在尝试编写一个 Plug 来对用户进行身份验证(实际上是检查会话)。我无法获取重定向路由。我认为这是因为路由生成发生在这个插件被激活之后。

无论如何我得到了这样的错误:undefined function TestApp.page_path/2

在常规上下文中 page_path/2 显然存在并且有效。

defmodule TestApp.Plugs.Authenticate do
  import Plug.Conn

  def init(default), do: default

  def call(conn, _)  do
    user = Plug.Conn.get_session(conn, :current_user)
    if not is_nil(user) do
      assign(conn, :user, user)
    else
      conn
      |> Phoenix.Controller.put_flash(:warning, "User is not authenticated.")
      |> Phoenix.Controller.redirect(to: TestApp.page_path(conn, :index))
      |> halt
    end
  end

end

你把控制器助手带进来了吗?

use TestApp.Web, :controller

(我会 post 作为评论但没有代表)

路由器助手包含在您的控制器中并通过 web.ex 文件查看:

  def controller do
    quote do
      use Phoenix.Controller
      ...
      import MyApp.Router.Helpers
    end
  end

  def view do
    quote do
      use Phoenix.View, root: "web/templates"
      ...
      import MyApp.Router.Helpers
      ...
    end
  end

如您所见,controllerview 函数都导入了 MyApp.Router.Helpers 模块。这是您的助手(_pathurl)函数定义的地方。

您可以使用完全限定名称:

Phoenix.Controller.redirect(to: TestAppRouter.Helpers.page_path(conn, :index))

或者您可以导入路由助手并只使用 page_path

import MyApp.Router.Helpers
# or
import MyApp.Router.Helpers, only: [page_path: 2]

但是,如果您随后在路由器的管道中使用该插件,则会导致循环依赖,您的代码将无法编译。

这个有用吗? Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))

我认为 Gazler 的观点有道理。您可以导入或完整路径。