我有一个user_authenticate方法,它根据会话设置@current_user。我有一个导航栏布局,其中包含导航链接。我想隐藏其中一个链接并仅在用户ID为8(即admin)时显示它。我写了这样的布局。
<div align="center" style="width: 90%">
<nav class="navbar navbar-inverse" role="navigation">
<%= link_to "Home", '/', :class => "btn btn-default navbar-btn"%>
<%= link_to "Currency Master", currencies_url, :class => "btn btn-default navbar-btn"%>
<%= link_to "Receipts", receipts_url, :class => "btn btn-default navbar-btn"%>
<%= link_to "Expenses", expenses_url, :class => "btn btn-default navbar-btn"%>
<%= link_to "Exchange", exchanges_url, :class => "btn btn-default navbar-btn"%>
<% if @current_user.id == 8 %><%= link_to "Report", reports_url, :class => "btn btn-default navbar-btn" %>
<% end %>
</nav>
代码工作正常,只显示导航栏上的“报告”按钮,用户ID为8.但是一旦点击链接,我就会出现以下错误。
undefined method `id' for nil:NilClass
Extracted source (around line #8):
6
7
8
9
10
<%= link_to "Expenses", expenses_url, :class => "btn btn-default navbar-btn"%>
<%= link_to "Exchange", exchanges_url, :class => "btn btn-default navbar-btn"%>
<% if @current_user.id == 8 %><%= link_to "Report", reports_url, :class => "btn btn-default navbar-btn" %>
<% end %>
</nav>
答案 0 :(得分:1)
即使@current_user.id
不存在,您也在检查@current_user
。所以它给出了一个错误。
首先检查current_user的存在情况,然后检查ID,
<强> @current_user.present? && @current_user.id == 8
强>
更改此行,
<% if @current_user.id == 8 %><%= link_to "Report", reports_url, :class => "btn btn-default navbar-btn" %>
<% end %>
要,
<% if (@current_user.present? && @current_user.id == 8) %><%= link_to "Report", reports_url, :class => "btn btn-default navbar-btn" %>
<% end %>
答案 1 :(得分:1)
首先,您不应该检查用户是否是按ID管理。你可以有一个布尔类型的“is_admin”列,并检查如下:
if @current_user.is_admin?
# ...
其次,在检查列的值之前,您可以先检查对象本身是否存在。所以你的if条件可以是这样的:
if @current_user && @curent_user.is_admin?
# show admin menu
else
# show other menus
end