2010-11-23 8 views
1
unless @client.nil? 
    TestMailer.snap_shot_error("test1","Errors", 
     {:file_name => File.basename(upload_file),:client_name => @client.client_name}) 
else 
    TestMailer.snap_shot_error("test1","Errors", 
     {:file_name => File.basename(upload_file)) 
end 

def snap_shot_error(to_address,subject,options={}) 
    # code 
end 

<% if @client_name %> 
    <%= _("There were problems with file ") + @file_name + _(" for client ") + @client_name %> 
<% else %> 
    <%= _("There were problems with file ") + @file_name %> 
<% end %> 

Répondre

3

Pour ces deux questoin, vous pouvez utiliser l'opérateur ternaire. Cela fonctionne comme ceci

condition ? value_if_true : value_if_false 

Ceci est une expression (une séquence de valeurs et d'opérateurs qui produit une autre valeur). Il détermine si la condition est vraie ou fausse, et évalue à la première valeur (après le? Et avant le :) si la condition est vraie, et la deuxième valeur (après le :) si la condition est fausse.

Ainsi, pour le premier exemple de code affiché, vous pouvez le faire:

TestMailer.snap_shot_error("test1", "Errors", 
    :file_name => File.basename(upload_file), 
    :client_name => @client ? @client.client_name : nil) 

[Notez que j'ai enlever les accolades autour des options - en Ruby il ne sont pas nécessaires pour la finale les options de hachage, et il est idiomatiques de les laisser off]

Ou si, pour une raison quelconque, vous ne voulez même pas nul: client_name dans le hachage, vous pouvez utiliser l'opérateur ternaire et une fusion:

TestMailer.snap_shot_error("test1", "Errors", 
    {:file_name => File.basename(upload_file)}.merge(
    @client ? { :client_name => @client.client_name } : {})) 

Pour la vue, vous pouvez également utiliser l'opérateur ternaire:

<%= _("There were problems with file ") + @file_name + 
    (@client_name ? _(" for client ") + @client_name : '') %> 

Et maintenant que je vois ce que vous faites avec @client_name, je ne vois pas pourquoi vous avez dit vous avez besoin que ce soit même pas dans la hacher. Le premier exemple de code que j'ai posté, où il passe ": client_name => @ client.client_name" s'il y a un client et passe ": client_name => nil" s'il n'y a pas de client, cela devrait fonctionner correctement. Il n'y a aucune raison de ne pas passer: client_name au lieu de simplement passer un nil: nom_client.

+0

Je ne veux pas passer la clé client_name dans les options. Si @client n'est pas disponible. –

+0

@krunal shah, j'ai déjà mis à jour mon post pour tenir compte de cette possibilité. Voir la mise à jour. –

+0

Merci pour votre réponse. Comment puis-je résoudre le même problème avec mon point de vue? J'ai mis à jour ma question. –

Questions connexes