2011-10-05 9 views
18

Tengo el siguiente en mi application_controller.rbRubí menos && comunicado

def layout 
    unless request.subdomain.empty? && current_user.nil? 
    self.class.layout 'admin' 
    end 
end 

Parece que el código anterior que no está funcionando. Pero cuando hago lo siguiente, funciona.

def layout 
    unless request.subdomain.empty? 
    unless current_user.nil? 
     self.class.layout 'admin' 
    end 
    end 
end 

Me gustaría simplificar el código eliminando una declaración a menos. ¿Cómo podría hacer eso?

Respuesta

55

unless something es equivalente a if !something. En su caso, eso sería

if !(request.subdomain.empty? && current_user.nil?) 

Sin embargo, desea

if (!request.subdomain.empty? && !current_user.nil?) 

Usando álgebra de Boole (De regla de Morgan), puede volver a escribir que a

if !(request.subdomain.empty? || current_user.nil?) 

Usando unless

unless request.subdomain.empty? || current_user.nil? 
+0

Eres el hombre. Buena respuesta... – jaydel

8

Si desea ajustar la disposición a 'admin'si el subdominio es no vacío y el usuario actual es no nula:

def layout 
    if !request.subdomain.empty? && !current_user.nil? 
    self.class.layout 'admin' 
    end 
end 

Cambiar la lógica de usar if declaraciones y predicados positivos, hará que la lógica en su código sea mucho más fácil de entender:

def layout 
    if request.subdomain.present? && current_user 
    self.class.layout "admin" 
    end 
end 

La mejor práctica es evitar unless excepto en los casos más triviales.

4

Uso:

if (!request.subdomain.empty? && !current_user.nil?) 

nunca uso unless con cualquier cosa que es más complejo (contiene o/y), es demasiado difícil de razonar acerca de una declaración como esa.