2016-10-25 2 views
0

J'ai une méthode user_authenticate qui définit @current_user en fonction de la session. J'ai une disposition de la barre de navigation qui contient les liens de navigation. Je veux cacher un des liens et ne le montrer que si l'identifiant de l'utilisateur est 8 (qui est admin). J'ai écrit la mise en page comme ça.en utilisant link_to inside si

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

Le code fonctionne très bien qu'il montre le bouton « Rapport » sur navbar seulement de l'ID utilisateur est 8. Mais dès que je clique sur le lien, je me l'erreur suivante.

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

pouvez-vous s'il vous plaît ajouter les journaux d'erreur complète? – Zero

Répondre

1

D'abord, vous ne devriez pas vérifier si l'utilisateur est un administrateur par ID. Vous pouvez avoir un « is_admin » colonne de type booléen et vérifier comme ceci:

if @current_user.is_admin? 
# ... 

En second lieu, vérifier avant que la valeur d'une colonne, vous pouvez vérifier d'abord si l'objet lui-même existe. Donc votre condition si peut être comme ceci:

if @current_user && @curent_user.is_admin? 
    # show admin menu 
else 
    # show other menus 
end 
+0

J'aime votre solution car elle me donnerait aussi des options pour créer plus d'un admin mais quand je l'essaye comme ci-dessous – Parry

+0

J'aime votre solution car elle me donnerait aussi des options pour créer plus d'un admin mais quand je l'essaye comme ci-dessous '<% si @current_user && @ current_user.is_admin%><% = link_to "Rapport", reports_url,: class => "btn btn-default-navbar btn" %> <% end %> ' Je me suit erreur ** méthode non définie 'is_admin 'pour # Parry

+0

@Parry désolé le retard. C'est parce que vous n'avez pas cette colonne. Vous devez créer une migration pour ajouter cette colonne avec le type booléen – psantos

1

Vous regardez @current_user.id même si @current_user n'est pas présent. donc c'est donner une erreur.

d'abord vérifier la présence de current_user puis vérifiez id,

@current_user.present? && @current_user.id == 8

Modifier cette ligne,

<% 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 %> 
+0

@Parry, avez-vous vérifié cela? – Sravan