函数nil.id/0未定义或私有 - Elixir

时间:2017-01-02 19:47:44

标签: elixir phoenix-framework

我尝试使用监护人身份验证来测试用户ID是否等于资源ID。如果没有当前令牌并且我尝试转到正在检查令牌的URL,则会收到此错误function nil.id/0 is undefined or private。我来自红宝石背景,我不知道为什么它说.id是一个功能?为什么这会引发错误。这是我的代码:

def index(conn, %{"user_id" => user_id}) do
    user = Repo.get(User, user_id)
           |> Repo.preload(:projects)
    cond do
      user.id == Guardian.Plug.current_resource(conn).id ->
        conn
        |> render("index.html", projects: user.projects, user: user)
      :error ->
        conn
        |> put_flash(:info, "No access")
        |> redirect(to: session_path(conn, :new))
    end
  end

如果没有current_resource,则会输出此错误。但是如果没有current_resource,我只希望它继续:错误路径并呈现会话路径。

1 个答案:

答案 0 :(得分:1)

这是因为您致电Guardian.Plug.current_resource(conn).idGuardian.Plug.current_resource(conn)正在nil。由于nil是Elixir中的Atom,模块也是如此,因此.id尝试在名为id的模块(不存在)上调用函数nil。要解决此问题,您可以添加另一项检查以查看Guardian.Plug.current_resource(conn)是否为零:

cond do
  (resource = Guardian.Plug.current_resource(conn)) && user.id == resource.id ->
    conn
    |> render("index.html", projects: user.projects, user: user)
  :error ->
    conn
    |> put_flash(:info, "No access")
    |> redirect(to: session_path(conn, :new))
end