2010-12-12 3 views
1

Je suis en train de créer une méthode qui ingère les e-mails entrants et traite le courrier électronique. En cours de route, il y a beaucoup de choses qui pourraient empêcher le processus d'être couronné de succès. La mauvaise adresse de réponse, l'adresse erronée, un corps de message vide, etc.Rails 3 - Comment faire face à des instructions Switch complexes/If Statements

Le code est rempli d'instructions Switch Statements (case/when/end) et If. J'aimerais apprendre une façon plus intelligente et plus propre de le faire. En outre, un moyen de suivre une erreur et à la fin d'un endroit où il renvoie l'utilisateur avec une erreur. Est-ce que quelque chose comme ça est possible avec des rails?

@error = [] 

Case XXX 
when xxxx 
    if XXXXX 
    else 
    @error = 'You don't have permission to reply to the xxxxx' 
    end 
else 
    @error = 'Unfamilar XXXX' 
end 

Puis quelque chose à la fin comme ...

If @errors.count > 0 
    Send the user an email letting them know what went wrong 
else 
do nothing 
end 

Merci pour l'aide ici. Si vous connaissez d'autres tutoriels qui m'apprendraient à écrire une logique comme celle ci-dessus, ce serait génial. À l'heure actuelle, j'ai des observations cas/si allant à 3 niveaux profonds, il est difficile de le garder droit.

Merci

Répondre

2

Je suggère d'utiliser des exceptions. Commencez par this tutorial, puis utilisez Google, essais et erreurs pour aller à partir de là.

Editer: Dans les cas plus complexes, les exceptions peuvent ne pas être le bon outil. Vous pouvez utiliser les fonctions de validateur à la place, par exemple (voir d'autres réponses), ou vous pouvez simplement revenir au début au lieu de ifs nidification, par exemple .:

unless sender_valid? 
    @error = "Sender invalid" 
    return 
end 
unless subject_valid? 
    @error = "Invalid command" 
    return 
end 
# normal no-errors flow continues here... 
+0

Je préfère très exceptions. La sortie implicite de la méthode est exactement ce que vous voulez dans la plupart des cas. – aceofspades

+0

Utilisez uniquement des exceptions lorsque vous traitez une exception réelle. Si c'est un flux attendu, n'utilisez pas d'exceptions. Par exemple: toutes les données entrées par l'utilisateur sont souvent erronées et ne devraient jamais être traitées avec une exception. Le vrai moyen de nettoyer votre code est de le diviser en petits morceaux logiques (méthodes et classes). Avoir des cas imbriqués et ifs est généralement un problème de conception. L'utilisation d'exceptions dans ce cas est juste un bandaid, mais pas la vraie solution. – iain

+0

Si vous avez un cas complexe, il peut être préférable d'extraire les éléments dans des fonctions de validation au lieu d'utiliser des exceptions. Pesez vos options. – moeffju

1

Vous pouvez jeter une erreur quand quelque chose ne va pas. Alors attrapez-le à la fin de votre méthode.

http://phrogz.net/programmingruby/tut_exceptions.html

Pour rendre votre code plus lisible et ne pas avoir beaucoup de commutateur et si/then, vous pouvez créer des méthodes distinctes qui valident certains aspects et les appeler à partir de votre principale méthode de vérification des erreurs.

+0

en utilisant des exceptions peut ralentir votre application jusqu'à 17 fois – mpapis

+0

@mpapis: Êtes-vous sûr que c'est vrai pour Ruby? Pouvez-vous donner quelques références? – klew

+0

http://rpheath.com/posts/237-raising-custom-exceptions-in-rails - dans les commentaires – mpapis

3

D'abord, je voudrais simplement attribuer un symbole à chaque message d'erreur comme un hachage simple:

ErrorsDescription = { 
    :first => "First error", 
    :second => "Second error", 
    ... 
} 

et l'utilisation des symboles plutôt que des cordes.

Ensuite, vos instructions if et switch. Essentiellement, je ne peux pas vraiment vous aider, parce que je ne vois pas quel genre de déclarations de conditions vous avez. Que vérifiez-vous? Pourquoi avez-vous 3 conditions profondes? Vous pouvez probablement l'écrire plus simplement en utilisant if et switch - c'est donc ma première réponse à ce problème. Une autre solution peut être d'écrire des méthodes simples pour améliorer la lisibilité, de sorte que vous pouvez écrire comme ceci:

if @email.has_wrong_reply_to_address? 
    @errors << :wrong_reply_to_address 
else 
    ... 
end 

En outre, comme suggéré @mpapis, vous pouvez utiliser Rails construire dans le système de validation, mais pas aussi ActiveRecord mais comme ActiveModel. Here vous avez quelques exemples comment le faire et comment cela fonctionne (aussi jeter un oeil here).Bien sûr, vous devrez peut-être écrire des validations personnalisées, mais ce ne sont que des méthodes simples. Une fois que vous faites tout travail ci-dessus, vous pouvez simplement utiliser:

@email.valid? 

Et si ce n'est pas, vous avez toutes les erreurs de hachage:

@email.errors 

Tout comme dans l'objet ActiveRecord ordinaire.

Ensuite, vous pouvez étendre votre classe Emial avec la méthode send_error_email qui envoie un e-mail en cas d'erreur.

EDIT:

Ceci est de toute nouvelle information que vous avez joint dans le commentaire.

Vous n'avez pas besoin d'utiliser des ifs imbriqués et vous pouvez changer ici. Vous pouvez l'avoir ressembler à ceci:

def is_this_email_valid? 
    if !email_from_user_in_system? 
    @errors << :user_not_in_system 
    return false 
    end 
    if comment_not_exists? 
    @errors << :comment_not_exists 
    return false 
    end 
    if user_cannot_comment_here? 
    @errors << :permision_error 
    return false 
    end 
    ... 
    true 
end 

Ensuite, vous pouvez l'utiliser:

if [email protected]_this_email_valid? 
    @email.send_error_mail 
end 
+0

merci. La raison Il va 3 niveaux de profondeur est. Je vérifie d'abord que l'email provient d'un utilisateur du système. Ensuite, je m'assure qu'ils répondent à un commentaire qui existe. Ensuite, je m'assure qu'ils ont la permission de répondre à ce commentaire. Ensuite, je m'assure que le commentaire n'est pas vide/nul. Avoir du sens? – AnApprentice

+0

@AnApprentice: oui, c'est logique. Mais pourquoi répondre à un commentaire est par un mail? Tu ne peux pas utiliser les formulaires html pour ça? – klew

+0

@AnApprentice: Pourquoi ne pas simplement quitter tôt? Par exemple. "si le courrier ne provient pas d'un utilisateur valide, renvoyer une erreur". – moeffju

Questions connexes