如何定义我的 Plug/Phoenix 路由,以便拥有一组 URL,但根据登录的用户类型显示不同的内容?
例如,用户应访问
/home
并查看 帖子 列表,管理员应访问 /home
并查看 用户 列表,或者孩子可以看到 活动 列表,家长可以看到考试成绩。
页面应该具有截然不同的内容和行为、不同的根布局、功能和特性等。
我是否必须分派到一个“全球”
HomeController(Live)
并将其全部混合在一起?
由于您无法使用
plugs
中的 router
转发控制器操作,最简洁的选项是拥有 3 个路由,例如:/home
、/admin/home
和 /user/home
,然后处理重定向。您还可以减少到 2 条路线并处理来自用户一条的重定向。
例如:
/home
转发至HomeController#index
当用户被标记为管理员时,控制器重定向到
/admin/home
,否则呈现用户主页的模板。
使用
Plug
也可以更好地完成重定向
否则,如果您仍然只想保留一条路线,则需要直接在
HomeController#index
中进行检查,然后渲染正确的布局和模板。
例如:
defmodule MyAppWeb.HomeController do
def index(conn, _params), do: render_index(conn)
defp render_index(%{assigns: %{admin: true}}) do
conn
|> put_layout(html: {MyApp.Layouts, :admin_layout})
|> render(:admin_index)
end
defp render_index(%{assigns: %{admin: false}}) do
conn
|> put_layout(html: {MyApp.Layouts, :user_layout})
|> render(:user_index)
end
end