在内部使用link_to

时间:2016-10-25 06:55:07

标签: ruby-on-rails ruby

我有一个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>

2 个答案:

答案 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