2016-01-24 69 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有一個有效的觀點。您可以導入或完整路徑。