function nil.id/0 is undefined or private - Elixir

北城以北 提交于 2019-12-10 19:40:57

问题


I'm trying to test if a user id is equal to the resource id using guardian auth. If there is no current token and I try to go to a url that is checking for a token I get this error function nil.id/0 is undefined or private. I come from a ruby background and I don't know why it's saying .id is a function? and why this is throwing an error. Here is my code:

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

If there is no current_resource then it prints this error. But if there is no current_resource I just want it to continue to the :error path and render the session path.


回答1:


This is because you're calling Guardian.Plug.current_resource(conn).id and Guardian.Plug.current_resource(conn) is nil. Since nil is an Atom in Elixir and so are modules, .id on it tries to call the function id on the module named nil (which doesn't exist). To fix this, you can add another check to see if Guardian.Plug.current_resource(conn) is not nil:

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


来源:https://stackoverflow.com/questions/41432531/function-nil-id-0-is-undefined-or-private-elixir

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!