Ruby on rails Rails 3-如何处理复杂的Switch语句/If语句
我正在建立一种方法,接收传入的电子邮件,并处理电子邮件。在这一过程中,有很多事情可能会阻碍电子邮件的成功处理。错误的回复地址、错误的发件人地址、空邮件正文等 代码中充满了Switch语句(case/when/end)和If语句。我想学习一种更聪明、更干净的方法。此外,一种方法可以跟踪错误,并在最后有一个位置,它用电子邮件向用户返回错误。rails可以实现这样的功能吗Ruby on rails Rails 3-如何处理复杂的Switch语句/If语句,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在建立一种方法,接收传入的电子邮件,并处理电子邮件。在这一过程中,有很多事情可能会阻碍电子邮件的成功处理。错误的回复地址、错误的发件人地址、空邮件正文等 代码中充满了Switch语句(case/when/end)和If语句。我想学习一种更聪明、更干净的方法。此外,一种方法可以跟踪错误,并在最后有一个位置,它用电子邮件向用户返回错误。rails可以实现这样的功能吗 @error = [] Case XXX when xxxx if XXXXX else @error = 'Yo
@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
谢谢你的帮助。如果您知道任何其他教程,可以教我如何编写上述智能逻辑,那就太好了。现在我有案例/如果陈述深入到三个层次,很难保持正确
谢谢我建议使用异常。开始,然后使用谷歌,尝试和错误去从那里 编辑:在更复杂的情况下,异常可能不是正确的工具。例如,您可能希望使用验证器函数(参见其他答案),或者您可以提前返回而不是嵌套ifs,例如:
unless sender_valid?
@error = "Sender invalid"
return
end
unless subject_valid?
@error = "Invalid command"
return
end
# normal no-errors flow continues here...
我建议使用异常。开始,然后使用谷歌,尝试和错误去从那里 编辑:在更复杂的情况下,异常可能不是正确的工具。例如,您可能希望使用验证器函数(参见其他答案),或者您可以提前返回而不是嵌套ifs,例如:
unless sender_valid?
@error = "Sender invalid"
return
end
unless subject_valid?
@error = "Invalid command"
return
end
# normal no-errors flow continues here...
当出现错误时,您可能会抛出错误。然后在方法的末尾捕捉它
为了使代码更具可读性,并且没有太多的switch和if/then语句,您可以创建单独的方法来验证某些方面,并从主错误检查方法调用它们。当出现错误时,您可以抛出错误。然后在方法的末尾捕捉它
为了使代码更具可读性,并且没有太多switch和if/then语句,您可以创建单独的方法来验证某些方面,并从主错误检查方法调用它们。是否可以将消息映射到模型?然后所有的if/switch逻辑都将被验证并由rails自动处理。好的起点是
同样值得一读的是是否可以将您的消息映射到模型?然后所有的if/switch逻辑都将被验证并由rails自动处理。好的起点是
同样值得一读的是首先,我只想为每个错误消息分配一个符号作为一个简单的散列:
ErrorsDescription = {
:first => "First error",
:second => "Second error",
...
}
并使用符号而不是字符串
然后是if和switch语句。基本上我帮不了你,因为我不知道你有什么样的条件陈述。你在查什么?为什么你有三级深条件?也许您可以使用if和switch编写更简单的代码,所以这是我对这个问题的第一个答案。另一个解决方案可能是编写简单的方法来提高可读性,因此您可以这样编写:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
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
如果不是,则哈希中有所有错误:
@email.errors
就像在普通的ActiveRecord
对象中一样
然后,您可以使用send\u error\u email
方法扩展您的Emial
类,该方法在出现错误时发送电子邮件
编辑:
这是关于您在评论中附加的新信息
您不必在此处使用嵌套的ifs和开关。您可以让它看起来像这样:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
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
首先,我将只为每个错误消息分配一个符号作为一个简单的散列:
ErrorsDescription = {
:first => "First error",
:second => "Second error",
...
}
并使用符号而不是字符串
然后是if和switch语句。基本上我帮不了你,因为我不知道你有什么样的条件陈述。你在查什么?为什么你有三级深条件?也许您可以使用if和switch编写更简单的代码,所以这是我对这个问题的第一个答案。另一个解决方案可能是编写简单的方法来提高可读性,因此您可以这样编写:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
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
如果不是,则哈希中有所有错误:
@email.errors
就像在普通的ActiveRecord
对象中一样
然后,您可以使用send\u error\u email
方法扩展您的Emial
类,该方法在出现错误时发送电子邮件
编辑:
这是关于您在评论中附加的新信息
您不必在此处使用嵌套的ifs和开关。您可以让它看起来像这样:
if @email.has_wrong_reply_to_address?
@errors << :wrong_reply_to_address
else
...
end
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
使用异常可能会使应用程序的速度降低17times@mpapis:你确定这对Ruby是真的吗?你能提供一些参考资料吗在评论中,如果它正在处理收到的邮件,它很可能是一个离线作业。但即使不是这样,更可读的代码和更容易的错误处理肯定会超过“高达”17倍的性能下降,IMO。使用异常可能会使应用程序的速度降低到17倍times@mpapis:你确定这对Ruby是真的吗?你能提供一些参考资料吗在评论中,如果它正在处理收到的邮件,它很可能是一个离线作业。但即使不是这样,更具可读性的代码和更容易的错误处理肯定会超过“高达”17倍的性能下降,IMO。我非常喜欢例外情况。在大多数情况下,方法的隐式退出正是您想要的。只有在处理真正的异常时才使用异常。如果它是预期的流,则不要使用异常。例如:用户输入的任何数据通常都是错误的,不应在异常情况下进行处理。清理代码的真正方法是将其划分为小的逻辑块(方法和类)。嵌套案例和ifs通常是一个设计问题。在这种情况下使用异常只是一个简单的解决方案,但不是真正的解决方案。如果您有一个复杂的情况,最好将其抽象到验证器函数中,而不是使用异常。权衡一下你的选择。异常会把延迟的工作搞砸吗?如果你抓住(
r