我正在构建一种方法来提取传入的电子邮件,并处理该电子邮件。在此过程中,有很多事情可能会阻止电子邮件成功处理。错误的回复地址,错误的地址,空信息体等等。
代码中充满了Switch Statements(case / when / end)和If语句。我想学习一种更聪明,更清洁的方法。此外,一种可以跟踪错误的方法,最后有一个位置,它通过电子邮件向用户发送错误信息。轨道可以这样吗?
@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
然后最后的事情就像......
If @errors.count > 0
Send the user an email letting them know what went wrong
else
do nothing
end
感谢您的帮助。如果您知道任何其他教程可以教我如何编写如上所述更聪明的逻辑,那就太棒了。现在我的case / if语句有3级深度,很难保持原状。
由于
答案 0 :(得分:3)
首先,我只是将每个错误消息的符号分配为一个简单的哈希:
ErrorsDescription = {
:first => "First error",
:second => "Second error",
...
}
使用符号代替字符串。
然后,你的if和switch语句。基本上我无法真正帮助你,因为我没有看到你有什么样的条件陈述。你在检查什么?为什么你有3级深度条件?也许你可以使用if和switch更简单地编写它 - 所以这是我对这个问题的第一个答案。另一种解决方案可能是编写简单的方法来提高可读性,因此您可以这样编写:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
另外,正如@mpapis建议的那样,您可以在验证系统中使用Rails构建,但不能用ActiveRecord
作为ActiveModel
。 Here您有一些示例如何操作以及如何工作(另请查看here)。当然,您可能需要编写自定义验证,但它们只是简单的方法。完成上述所有工作后,您可以使用:
@email.valid?
如果不是,那么哈希就会出现所有错误:
@email.errors
就像普通的ActiveRecord
对象一样。
然后,您可以使用Emial
方法扩展send_error_email
课程,如果出现错误,该方法会发送电子邮件。
编辑:
这是关于您在评论中附加的新信息。
您不必使用嵌套ifs并在此处切换。你可以看起来像这样:
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
然后你可以使用它:
if !@email.is_this_email_valid?
@email.send_error_mail
end
答案 1 :(得分:2)
我建议使用例外。从this tutorial开始,然后使用Google,试用和错误从那里开始。
修改:在更复杂的情况下,异常可能不是正确的工具。例如,您可能希望使用验证器函数(请参阅其他答案),或者您可以提前返回而不是嵌套ifs,例如:
unless sender_valid?
@error = "Sender invalid"
return
end
unless subject_valid?
@error = "Invalid command"
return
end
# normal no-errors flow continues here...
答案 2 :(得分:1)
当某些事情不对时,您可能会抛出错误。然后在方法结束时抓住它。
http://phrogz.net/programmingruby/tut_exceptions.html
为了使您的代码更具可读性,并且没有大量的switch和if / then语句,您可以创建单独的方法来验证某些方面,并从主要的错误检查方法中调用它们。
答案 3 :(得分:1)
是否可以将消息映射到模型?然后所有的if / switch逻辑都是验证并由rails自动处理。良好的起点是active record validations guide
另外值得一读的是action mailer guide