我试图编写一个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 :(得分: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
如您所见,controller
和view
函数都会导入MyApp.Router.Helpers
模块。这是您的助手(_path
和url
)函数的定义。
您可以使用完全限定名称:
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
(我会将其作为评论发布,但没有代表)