2011-10-05 10 views
18

Ho il seguente nel mio application_controller.rbRubino a meno && dichiarazione

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

Sembra che il codice di cui sopra non funziona. Ma quando faccio quanto segue, funziona.

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

Mi piacerebbe semplificare il codice rimuovendone uno a meno che non sia una dichiarazione. Come potrei farlo?

risposta

55

unless something è equivalente a if !something. Nel tuo caso, che sarebbe

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

Tuttavia, si desidera

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

Utilizzando l'algebra booleana (De Morgan regola), è possibile riscrivere che a

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

Utilizzando unless

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

Sei The Man. Bella risposta... – jaydel

8

Se si desidera impostare il layout per 'admin'se il sottodominio è non vuoto e l'utente corrente è non nil:

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

Cambia la logica di utilizzare if dichiarazioni e predicati positive, renderà la logica del codice molto più facile da capire:

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

La migliore pratica è evitare unless tranne nei casi più banali.

4

Usa:

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

Io non uso mai unless con tutto ciò che è più complesso (contiene o/e), è semplicemente troppo difficile ragionare su una dichiarazione del genere.