2016-01-24 68 views
7

我想写一个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 
+0

什么是page_path?如果它是一个函数,你可以发布它 –

+0

它生成内部路由器与'get“/”,PageController,:index' –

+1

这是否工作? Phoenix.Controller.redirect(到:TestApp.Router.Helpers.page_path(conn,:index,“hello world”)) –

回答

7

路由器助手都包含在通过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] 

但是,如果你再在管道中使用该插件你的路由器,你会导致循环依赖和你的代码不会编译。

+0

谢谢:)桑德斯索尼已经对此作出评论之前,但我仍然接受,那是我一直在寻找。谢谢 –

0

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

use TestApp.Web, :controller 

(我会后,作为一个评论,但不具备代表)

+0

我认为控制器助手打破控制器时,我把插头内的另一个控制器。无论如何,我尝试过,它没有工作;) –

2

这是行不通的? Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))

我认为Gazler有一个有效的观点。您可以导入或完整路径。