2017-01-02 47 views
3

我试图测试一个用户id是否等于使用guardian auth的资源id。如果没有当前令牌,并且我尝试访问正在检查令牌的网址,则会出现此错误function nil.id/0 is undefined or private。我来自一个红宝石背景,我不知道它为什么说.id是一个函数?为什么这是抛出一个错误。这里是我的代码:函数nil.id/0是未定义的或私有的 - Elixir

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,我只想让它继续:error路径并呈现会话路径。

回答

1

这是因为您打电话给Guardian.Plug.current_resource(conn).idGuardian.Plug.current_resource(conn)nil。由于nil是Elixir中的Atom,因此模块上的模块.id会尝试调用名为nil(不存在)的模块上的函数id。为了解决这个问题,你可以添加其他检查,看是否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 
+0

我欣赏的帮助,我认为你是对的,但是当我改变了代码,我得到这个错误。 'web/controllers/admin/project_controller.ex:12:未定义的函数资源/ 0'。那就是当我把这行改成这个'resource == Guardian.Plug.current_resource(conn)&& user.id = resource.id' – Bitwise

+0

对不起,忘了标记你 – Bitwise

+0

这是'resource =',而不是'=='。 – Dogbert