错误代码发送许多电子邮件

时间:2013-01-04 09:48:04

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

我有以下ROR代码

def func (point,c,r)          
  res=isPointInCircle(point,c,r) #returns  true/ false
 if res=='false'               
   AlertMailer.geofence('mail@gmail.com').deliver
 end
end
每隔2分钟用不同点调用

func。

isPointInCircle检查点是否在圆圈内。返回true false。

我想在第一次在圈外或圈内时发送邮件。

  • 表示最初点在内部1小时。

    没有邮件

  • 如果外出

    我希望发送一封不发生的邮件,

    因为func每2分钟调用一次。 所以每隔2分钟发送一次我不想要的电子邮件。

那怎么做呢

1 个答案:

答案 0 :(得分:4)

您可以检查以前的状态是否与当前状态相同,并且仅在发生更改时发送邮件(该点位于圆圈内且之前位于外部,反之亦然)。

def func(point, c, r)
  status = point_in_circle?(point, c, r)
  if last_status != status
    AlertMailer.geofence('mail@gmail.com').deliver
  end
end

如果不了解有关您应用的更多信息,很难说如何实施last_status。如果有Point模型,我可以添加in_circle?作为实例方法。然后你可以从数据库中获取前一点并比较两者:

def check_point_status(current, previous, c, r)
  if current.in_circle?(c, r) != previous.in_circle?(c, r)
    AlertMailer.geofence('mail@gmail.com').deliver
  end
end

一些指示:Ruby通常使用snake_case而非camelCase用于变量和函数,而“谓词”方法(返回true / false)通常在末尾用问号命名以指示他们是/不是问题。您不需要在代码中添加注释,因为很明显point_in_circle?返回true或false。

此外,您的代码建议您的函数返回"true""false"作为字符串,这是一个非常糟糕的主意!如果您使用实际的布尔值truefalse,则可以将原始代码编写为

def func(point, c, r)          
  unless point_in_circle?(point, c, r)             
    AlertMailer.geofence('mail@gmail.com').deliver
  end
end