2009-10-21 11 views
0

Cela me dérange. Il ne semble pas trop sec. Quelle serait une meilleure mise en œuvre? En aparté, comment se fait-il que ce finder d'ActiveRecord ne lève pas une exception quand l'enregistrement n'est pas trouvé, mais .find fait?Comment SECHER cet extrait de code Ruby?

def current_account 
    return @account if @account 
    unless current_subdomain.blank? 
     @account = Account.find_by_host(current_subdomain) 
    else 
     @account = nil 
    end 
    @account 
    end 

Répondre

3

Je coderez cela comme

def current_account 
    @account ||= current_subdomain.blank? ? nil : Account.find_by_host(current_subdomain) 
end 

En ce qui concerne les exceptions, les méthodes find_by dynamiques retour nil au lieu de lancer une exception. Si vous voulez une exception, utilisez le find avec :conditions:

def current_account 
    @account ||= current_subdomain.blank? ? nil : Account.find(:first, :conditions => {:host => current_subdomain}) 
end 
0

Que diriez-vous:

def current_account 
    @account ||= Account.find_by_host(current_subdomain) unless current_subdomain.blank? 
end 
5
def current_account 
    @account ||= current_subdomain && Account.find_by_host(current_subdomain) 
end 

Si un enregistrement est introuvable, les méthodes find_by dynamiques retour à zéro, find_by_all retourne un tableau vide.

+0

+1, le vôtre est beaucoup mieux que le mien. –

+0

Mais .find_by_host ne devrait pas être appelé si current_subdomain est une chaîne vide. Et si le && échoue, quel sera @account assigné? faux? – Alexandre

+1

Cependant, cela échoue si current_subdomain est "". "" évalue à true dans un contexte booléen. Devrait être '! Current_subdomain.blank?' – EmFi

0
def current_account 
    @account ||= current_subdomain.present? && Account.find_by_host(current_subdomain) 
end 

#present? se chargera nil et des chaînes vides

Questions connexes