如何在Phoenix渲染的EEx模板中获取当前用户并展示已使用积分
问题原因与解决方案
核心问题定位
你遇到的问题有三个核心诱因:
- 你的认证管道没有正常将登录用户写入
conn.assigns.current_user,或者访问page/index路由的请求没有走已认证的管道组,导致拿到的current_user是nil - 你在
PageController的index动作中传入模板的current_user没有预加载pool关联,就算用户不为空直接访问@user.pool也会抛出关联未加载错误 - 你写的
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
相关产品推荐
相关产品推荐

