使用模块插件,我从数据库中获取当前用户信息,并将其作为current_user
存储在Plug.Conn.assigns中。通过检查连接,我看到分配中的当前用户详细信息,但我无法访问任何详细信息。
例如,我想显示当前用户的名称,如“您以@conn.assigns.current_user.name
登录”,但Phoenix显示当前用户为nil
。
请查看随附的屏幕截图。
Plug.Conn.assigns中肯定有一个current_user对象。我应该可以访问名称“cooldude77@aol.com”。那么,为什么凤凰告诉我current_user是nil?
修改 添加当前用户插件:
def call(conn, _params) do
if conn.assigns[:current_user] do
conn
else
user_id = get_session(conn, :user_id)
cond do
user = Repo.get_by(User, auth_id: user_id) ->
conn
|> assign(:current_user, user)
|> assign(:user_signed_in?, true)
true ->
conn
|> assign(:current_user, nil)
|> assign(:user_signed_in?, false)
end
end
end
所以,我在这里使用Auth0进行身份验证。用户登录Auth0并重定向回应用程序,其中包含我跟踪的3个属性,唯一的auth_id,名称和头像。登录后,我通过检查他们的auth_id是否保存在我的数据库中来检查这是否是新用户,如果是,那么我知道他们是返回用户并且我将current_user
对象分配给用户。如果他们是新用户,我将它们添加到我的数据库(给他们一些额外的属性)并将current_user
对象分配给用户。
仍遇到此问题我在连接中有current_user但我无法访问用户的属性 - 它们显示为nil
答案 0 :(得分:0)
您应该只需要在模板中使用@current_user.name
即可吸引用户。
此外,由于没有人登录时插件中的current_user
的值设置为nil
,因此您可以执行!!@current_user
而不是上面的@conn.assigns[:user_signed_in?]
。
答案 1 :(得分:0)
@Badu的假设使我发现了这个问题。在我的控制器代码中,我最初将current_user
从会话传递给render
函数,如下所示:
def index(conn, _params) do
render(conn, "index.html", current_user: get_session(conn, :current_user))
end
随着应用程序的增长和我添加更多页面,我不得不继续从会话中吸引当前用户,因此我决定用一个插件替换此行为,我在上面发布了代码。但是,我忘记了从控制器中删除存储在连接中的current_user
对象。因此,尽管我的连接中确实存在一个current_user
对象,但是我的view_template正在访问current_user
的旧版本,该版本不具有相同的属性,因此值为nil。