Phoenix 框架插件内的重定向
Redirection inside a plug in 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
你把控制器助手带进来了吗?
use TestApp.Web, :controller
(我会 post 作为评论但没有代表)
路由器助手包含在您的控制器中并通过 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]
但是,如果您随后在路由器的管道中使用该插件,则会导致循环依赖,您的代码将无法编译。
这个有用吗?
Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))
我认为 Gazler 的观点有道理。您可以导入或完整路径。
我正在尝试编写一个 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
你把控制器助手带进来了吗?
use TestApp.Web, :controller
(我会 post 作为评论但没有代表)
路由器助手包含在您的控制器中并通过 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]
但是,如果您随后在路由器的管道中使用该插件,则会导致循环依赖,您的代码将无法编译。
这个有用吗?
Phoenix.Controller.redirect(to: TestApp.Router.Helpers.page_path(conn, :index))
我认为 Gazler 的观点有道理。您可以导入或完整路径。