在Phoenix框架中的插件内重定向

Kel*_*all 9 elixir 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
Run Code Online (Sandbox Code Playgroud)

Gaz*_*ler 9

路由器助手包含在您的控制器中并通过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
Run Code Online (Sandbox Code Playgroud)

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

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

Phoenix.Controller.redirect(to: TestAppRouter.Helpers.page_path(conn, :index))
Run Code Online (Sandbox Code Playgroud)

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

import MyApp.Router.Helpers
# or
import MyApp.Router.Helpers, only: [page_path: 2]
Run Code Online (Sandbox Code Playgroud)

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