如何从一条路线为不同的用户角色提供不同的控制器/实时视图

问题描述 投票:0回答:1

如何定义我的 Plug/Phoenix 路由,以便拥有一组 URL,但根据登录的用户类型显示不同的内容?

例如,用户应访问

/home
并查看 帖子 列表,管理员应访问
/home
并查看 用户 列表,或者孩子可以看到 活动 列表,家长可以看到考试成绩

页面应该具有截然不同的内容和行为、不同的根布局、功能和特性等。

我是否必须分派到一个“全球”

HomeController(Live)
并将其全部混合在一起?

elixir phoenix-framework phoenix-live-view
1个回答
0
投票

由于您无法使用

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
© www.soinside.com 2019 - 2024. All rights reserved.