Ruby on rails。如果出现错误,请正确验证和救援代码

时间:2016-04-27 15:22:39

标签: ruby-on-rails validation timezone

我在这里有一些代码可以正常工作,但是如果出现错误则不是非常安全,特别是Exception: Timezone::Error::GeoNames来自Timezone宝石的location非常偶然地宝石未能从提供的坐标中检索时区。

用户可以创建演出,其中包含latitude属性。位置和地址以及地理编码器会将此地址转换为longitudelatitude

保存演出后,longitudeif @gig.save timezone = Timezone.lookup(@gig.latitude, @gig.longitude) @gig.update_attributes(timezone: timezone) if @gig.timezone gigzonetime = @gig.date - @gig.date.in_time_zone(@gig.timezone).utc_offset @gig.update_attributes(gigzonetime: gigzonetime) else gigzonetime = @gig.date @gig.update_attributes(gigzonetime: gigzonetime) end bla bla bla .................. 可用,所以在我的控制器中我有:

Exception: Timezone::Error::GeoNames

此处Timezone gem在保存演出后使用坐标查找时区。这通常没有问题,但偶尔会抛出错误(before_validation),可能暂时无法找到服务器。

如何在保存后自动执行此代码,但在发生故障时可以回退,并将gigzonetime设置为UTC(默认rails rails timezone)。

由于Timezone::Error::InvalidZonelongitude属性尚未可用,因此模型中的

latitude无效,因为它会引发after_validation错误。 Geocoder文档建议使用ngCookies,因此这就是他们无法使用的原因。

我觉得这可能是一个简单的解决方案,但我已经糊涂了。

1 个答案:

答案 0 :(得分:0)

只要你有办法从错误中解救出来,我就不明白为什么你不能使用before_validation。另外,您有理由在保存后想要这样做吗?之前做到这一点是有意义的,以避免两次写入数据库:

# `before_validation :set_timezone` should also work
before_save :set_timezone

def set_timezone
  # Do geocoding...
rescue Timezone::Error::GeoNames => e
  self.gigzonetime = "UTC"  # Or whatever
end