You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Phoenix渲染的EEx模板中获取当前用户并展示已使用积分

问题原因与解决方案

核心问题定位

你遇到的问题有三个核心诱因:

  1. 你的认证管道没有正常将登录用户写入conn.assigns.current_user,或者访问page/index路由的请求没有走已认证的管道组,导致拿到的current_user是nil
  2. 你在PageController的index动作中传入模板的current_user没有预加载pool关联,就算用户不为空直接访问@user.pool也会抛出关联未加载错误
  3. 你写的show_single_user_points方法完全没有被调用:你是在index.html模板中内嵌渲染子模板,参数是父模板直接传入的,和这个控制器方法没有任何关系

修复步骤

1. 配置认证路由管道

打开router.ex,确认访问首页的路由是放在经过认证的管道组下,确保用户未登录时会跳转到登录页,不会出现current_user为空的情况,示例配置参考:

# 已认证用户的路由组
scope "/", EmployeeRewardAppWeb do
  pipe_through [:browser, :require_authenticated_user]

  get "/", PageController, :index
  # 其他需要登录的路由
end

确保你的认证中间件(比如Phoenix默认的fetch_current_user插件)已经正常写入conn.assigns.current_user。

2. 给current_user预加载pool关联

修改PageController的index方法,给current_user预加载关联:

def index(conn, _params, current_user) do
  users = Accounts.list_users() |> Repo.preload(:pool)
  # 预加载当前用户的pool关联
  current_user_with_pool = Repo.preload(current_user, :pool)
  render(conn, "index.html", users: users, current_user: current_user_with_pool)
end

3. 确认子模板参数匹配

你现在在index.html.eex中渲染子模板的代码是正确的,传入的user: @current_user和子模板中使用的@user变量名匹配,不需要额外修改。如果后续需要单独做积分详情页走show_single_user_points方法,需要在路由中添加对应路由,同时修改该方法的render参数和子模板变量名匹配即可。

内容的提问来源于stack exchange,提问作者Kapeusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:57:02