函数 nil.id/0 未定义 - Elixir、Phoenix

Ale*_*ndr 1 elixir phoenix-framework

我不知道如何正确进行检查以向用户隐藏操作

<%= if @current_user.id == @post.user_id do %>
  <span>
    <%= link "Edit", to: Routes.post_path(@conn, :edit, @post) %>
  </span>
  <span>
    <%= link "Delete", to: Routes.post_path(@conn, :delete, @post), method: :delete, data: [confirm: "Are you sure"] %>
  </span>
<% end %>
Run Code Online (Sandbox Code Playgroud)

当用户未登录时,出现此错误:

GET/posts/1函数中的 UndefinedFunctionErrornil.id/0未定义

sab*_*ara 8

在本例中,您的@current_usernil,因此 Elixir 尝试运行nil.id但失败了。

您可能可以通过nil首先检查来解决您的问题:

<%= if @current_user && @current_user.id == @post.user_id do %>
Run Code Online (Sandbox Code Playgroud)

错误消息有点令人困惑,因为nil它也是一个原子,并且该a.b语法在 Elixir 中有两种用途:

  • :b访问映射/结构上的原子键a(您正在尝试执行的操作)
  • 调用a.b()函数,a作为模块原子

nil同样是一个原子,它被解释为nil.id(),但该nil.id/0函数不存在,因为nil它不是一个实际的模块。