Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3-如何处理复杂的Switch语句/If语句_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Rails 3-如何处理复杂的Switch语句/If语句

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

我正在建立一种方法,接收传入的电子邮件,并处理电子邮件。在这一过程中,有很多事情可能会阻碍电子邮件的成功处理。错误的回复地址、错误的发件人地址、空邮件正文等

代码中充满了Switch语句(case/when/end)和If语句。我想学习一种更聪明、更干净的方法。此外,一种方法可以跟踪错误,并在最后有一个位置,它用电子邮件向用户返回错误。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
然后在最后的事情,像

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