2010-01-21 33 views
7

我有一個應用程序,在佈局中我有一個user_name div,根據他們是否登錄顯示不同的東西,是管理員等。現在我的代碼是以下:Ruby on Rails否則如果問題

<% if current_user.role == "admin" %> 
    <p id="admintxt">You are an admin!</p> 
     <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
    <% elsif current_user %> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
    <% else %> 
<%= link_to "Register", new_user_path %> 
<%= link_to "Login", login_path %> 
<% end %> 

我有一個CURRENT_USER助手已經和一切工作正常時,代碼只是:

<% if current_user %> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
<% else %> 
    <%= link_to "Register", new_user_path %> 
    <%= link_to "Login", login_path %> 
<% end %> 

現在,當我讓一個ELSIF語句,當我登錄的管理員它作品,我得到的文字顯示正確的鏈接。當我不是一個管理員用戶/註銷,我得到一個未定義的方法'的作用」爲無:NilClass錯誤......而且我CURRENT_USER東西在我的應用程序控制器聲明如下:

helper_method :current_user 


private 

def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
end 

def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
end 

任何想法我可以做顯示我想要的結果嗎? 「如果他們是角色屬性等於管理員的用戶,他們會得到一些文本和登錄鏈接,如果他們只是一個用戶,他們將獲得登錄鏈接,如果他們沒有登錄,他們將獲得註冊和登錄鏈接。

謝謝!

回答

11
<% if current_user %> 
    <% if current_user.role == "admin" %> 
    <p id="admintxt">You are an admin!</p> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
    <% else %> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
    <% end %> 
<% else %> 
    <%= link_to "Register", new_user_path %> 
    <%= link_to "Login", login_path %> 
<% end %> 

或使用Rails> = 2.3

<% if current_user.try(:role) == "admin" %> 
    <p id="admintxt">You are an admin!</p> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
<% elsif current_user %> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
<% else %> 
    <%= link_to "Register", new_user_path %> 
    <%= link_to "Login", login_path %> 
<% end %> 
+1

看着這讓我真的很感激哈姆。 :) – jerhinesmith 2010-01-21 17:49:53

+0

我一直在寫'erb',但從來沒有意識到這是多麼醜陋,直到我看到這一點。我現在感謝你的反應 – Hanmaslah 2017-01-12 18:05:08

3
<% if current_user and current_user.role == "admin" %> 

這可以防止錯誤時沒有用戶登錄,但你可以重組整個街區在爲了移除對current_user爲零的冗餘測試。

5

在當前用戶循環中隱藏角色檢查,這有一個簡化條件的副作用。

<% if current_user %> 
    <%= content_tag(:p, "You are an admin!", :id=>"admintxt") if current_user.role == "admin" %> 
    <%= link_to "Edit Profile", edit_user_path(:current) %> 
    <%= link_to "Logout", logout_path %> 
<% else %> 
    <%= link_to "Register", new_user_path %> 
    <%= link_to "Login", login_path %> 
<% end %> 
+0

非常感謝你,因爲我正在寫循環,我知道肯定有一種方法來簡化它。我正在學習很多! – 2010-01-21 19:31:51