Ruby:案例表达式

时间:2012-01-29 02:17:18

标签: ruby-on-rails ruby

我正在使用gmail从我的应用程序发送电子邮件。预计非常低的流量,但可能超过我可能会达到gmail邮件限制,所以我设置它(在我的应用程序控制器中)根据一天中的时间使用两个不同的帐户。

我已成功使用此设置但现在我已经引入了“大于”或“小于”符号,我收到有关“何时”的错误消息。在另一个应用程序中我做了

when Time.now == 1
    ....

when Time.now == 2
    ...etc 

它工作正常。

谁能告诉我这有什么问题?

  case

when Time.now.hour > 12


ActionMailer::Base.smtp_settings = {
  :user_name => "blahblahblah@gmail.com", 
  :password => ENV['GMAIL_PASS'], 
  :address => "smtp.gmail.com",
  :port => 587,
  :tls => true
}


when Time.now.hour < 12

ActionMailer::Base.smtp_settings = {
  :user_name => "blahblah@gmail.com", 
  :password => ENV['GMAIL_PASS'], 
  :address => "smtp.gmail.com",
  :port => 587,
  :tls => true
}


end

3 个答案:

答案 0 :(得分:2)

为什么只使用2个选项的case语句?一种非常简单,更优雅的方式来完成你想做的事情:

username = ["email1@gmail.com", "email2@gmail.com"].sample

然后你会得到一个随机分布,随着时间的推移将是50/50。我认为通常使用gmail进行批量邮寄很糟糕。任何体面的主机都可以为您提供SMTP服务器。

答案 1 :(得分:1)

我无法回答错误发生的原因。我测试了它,就像@summea说的那样,似乎没有else就可以工作(尽管使用else更好 - 你的例子在Time.now.hour == 12)时无效

但是,我认为按小时划分帐户是一个坏主意。 我怀疑这种用法是否会均匀分布;因为世界不同的地方会在不同的时间睡觉。 因此,您可能会发现80%的邮件是通过一个帐户发送的。

如果你按秒分割,你会获得更均匀的分布。

为了使后续修改更简单,您可能还需要为user_name设置变量,并避免重复其他服务器设置:

  case
    when Time.now.sec > 29
      user_name = "blahblahblah@gmail.com"
    else
      user_name = "blahblah@gmail.com"
  end

  ActionMailer::Base.smtp_settings = {
    :user_name => user_name, 
    :password => ENV['GMAIL_PASS'], 
    :address => "smtp.gmail.com",
    :port => 587,
    :tls => true
  }

答案 2 :(得分:0)

第二个“何时”应该是“其他”