2016-01-24 8 views
7

Ich versuche, eine Plug zu schreiben, die Benutzer authentifizieren (Sitzung tatsächlich überprüfen). Ich habe Schwierigkeiten, Umleitungsroute zu bekommen. Ich denke, es liegt daran, dass die Routengenerierung stattfindet, nachdem dieser Plug aktiviert wurde.Umleitung in einem Stecker in Phoenix Framework

Auf jeden Fall habe ich einen Fehler wie folgt aus: undefined function TestApp.page_path/2

In regelmäßigen Kontext page_path/2 existiert offensichtlich und arbeitet.

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

Was ist Seitenpfad? Wenn es eine Funktion ist, können Sie es –

+0

posten, es ist innerhalb des Routers mit 'get '/", PageController,: index' –

+1

erzeugt. Funktioniert das? Phoenix.Controller.redirect (zu: TestApp.Router.Helpers.page_path (conn,: index, "Hallo Welt")) –

Antwort

7

Router Helfer in Ihrem Controller und Blick über die web.ex Datei enthalten:

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 

Wie Sie kann sehen, controller und view Funktionen importieren Sie das MyApp.Router.Helpers Modul. Hier sind Ihre Helfer (_path und url) Funktionen definiert.

Sie entweder den vollständig qualifizierten Namen verwenden können:

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

Oder Sie können die Route Helfer importieren und verwenden nur page_path

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

Wenn Sie jedoch dann in einer Pipeline den Stecker verwenden in Ihr Router verursacht eine zirkuläre Abhängigkeit und Ihr Code wird nicht kompiliert.

+0

Danke :) Sandesh Soni hat schon vorher einen Kommentar dazu gemacht, aber ich werde trotzdem akzeptieren, das war was ich gesucht habe. Vielen Dank –

0

Haben Sie die Controller-Helfer hereingebracht?

use TestApp.Web, :controller 

(Ich würde schreiben, dass als Kommentar, aber nicht über die rep)

+0

Ich denke, Controller-Helfer brechen die Controller, wenn ich den Stecker in einen anderen Controller setzen. Jedenfalls habe ich das probiert und es hat nicht funktioniert;) –

2

Funktioniert das? Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))

Ich denke, Gazzer hat einen gültigen Punkt. Sie können entweder den vollständigen oder den vollständigen Pfad importieren.

Verwandte Themen