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

时间:2016-01-24 16:02:47

标签: 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

3 个答案:

答案 0 :(得分:8)

路由器助手包含在您的控制器中,并通过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]

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

答案 1 :(得分:2)

Does this work ? Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))

I think Gazler has a valid point. you can either import or full path.

答案 2 :(得分:0)

你带来了控制器助手吗?

use TestApp.Web, :controller

(我会将其作为评论发布,但没有代表)