2010-01-21 13 views
7

Tengo una aplicación donde en el diseño tengo un user_name div que mostrará diferentes cosas dependiendo de si están o no conectados, son administradores, etc. En este momento mi código es el siguiente :Ruby on Rails Else If Question

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

que tienen un ayudante current_user ya y todo estaba funcionando bien cuando el código era:

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

Ahora cuando yo le haga una declaración elsif, cuando estoy conectado como un administrador de TI funciona y obtengo el texto que se muestra con los enlaces correctos. Cuando no soy un usuario administrador/cerrado la sesión, aparece un método no definido 'papel' de cero: error NilClass ... También mis cosas current_user se declara en mi controlador de aplicación de la siguiente manera:

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 

Alguna idea de lo Puedo hacer para mostrar el resultado que quiero? "Si son usuarios con el atributo de rol igual a admin, reciben algo de texto y de los enlaces, si solo son usuarios, obtienen los enlaces y, si no están conectados, obtienen los enlaces de registro y de inicio de sesión. .

Gracias!

Respuesta

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

o con rieles> = 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

Al ver esto, realmente aprecio haml. :) – jerhinesmith

+0

He estado escribiendo 'erb' pero nunca me di cuenta de lo feo que es hasta que vi esto. Ahora aprecio reaccionar – Hanmaslah

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

Esto debe evitar el error cuando no hay ningún usuario conectado, pero se puede reestructurar todo el bloque en para eliminar las pruebas redundantes contra current_user siendo nil.

5

Oculte la comprobación de funciones en el bucle de usuario actual, que tiene el efecto secundario de simplificar su condicional.

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

Muchas gracias, mientras escribía el ciclo, sabía que definitivamente había una manera de simplificarlo. ¡Estoy aprendiendo mucho! –