我在这里有一些代码可以正常工作,但是如果出现错误则不是非常安全,特别是Exception: Timezone::Error::GeoNames
来自Timezone宝石的location
非常偶然地宝石未能从提供的坐标中检索时区。
用户可以创建演出,其中包含latitude
属性。位置和地址以及地理编码器会将此地址转换为longitude
和latitude
。
保存演出后,longitude
和if @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::InvalidZone
和longitude
属性尚未可用,因此模型中的 latitude
无效,因为它会引发after_validation
错误。 Geocoder文档建议使用ngCookies
,因此这就是他们无法使用的原因。
我觉得这可能是一个简单的解决方案,但我已经糊涂了。
答案 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