Rails 3 - 如何处理复杂的交换机语句/如果语句

时间:2010-12-12 18:36:22

标签: ruby-on-rails ruby-on-rails-3

我正在构建一种方法来提取传入的电子邮件,并处理该电子邮件。在此过程中,有很多事情可能会阻止电子邮件成功处理。错误的回复地址,错误的地址,空信息体等等。

代码中充满了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级深度,很难保持原状。

由于

4 个答案:

答案 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作为ActiveModelHere您有一些示例如何操作以及如何工作(另请查看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