0

我正在使用 ActiveSupport::TimeZone 根据邮政编码在某个位置设置时区。

def set_time_zone
  self.time_zone = ActiveSupport::TimeZone.find_by_zipcode(self.zip)
end

这在应用程序本身中工作得很好。我在 before_save 上调用 set_time_zone。

在使用 Rspec 运行测试时,当它尝试运行 set_time_zone 方法时,会出现“undefined method 'find_by_zipcode'in ActiveSupport::TimeZone”错误

我也在我的规范助手中包含了“需要'active_support/time_with_zone'”。

现在我的工作是在测试环境中排除之前的保存。

任何想法都会很棒。

4

1 回答 1

1

find_by_zipcode不是主要ActiveSupport::TimeZone对象的一部分。该对象的文档在此处,您不会找到任何提及邮政编码的内容。

谷歌搜索发现该方法是TZip gem 的一部分。既然你说它在你的应用程序中工作,我猜你那里有那个宝石。您可能只需要将它添加到您的测试项目中。(抱歉,对 Ruby 或 RSpec 不太熟悉,因此无法指导您)。

由于对时区非常熟悉,我想我也会借此机会解决一些关于将邮政编码映射到时区的一般想法的问题。我不太确定这是一个好主意。

  • 它非常关注美国。时区是全球性的,邮政编码仅在美国有效。
  • 邮政编码经常变化。USPS 发布数据库,您可以订阅这些数据库以更改此数据。从TZip 提交历史问题跟踪器中可以看出,在报告问题时,他们一直在手动添加邮政编码映射。这不是处理频繁更改的数据的好方法。
  • 邮政编码不是识别位置的最佳边界。有许多邮政编码覆盖不同的、不连续的区域。还有一些行政邮政编码不映射到任何特定位置(例如用于海外军事邮件的邮政编码)。
  • 对于那些为特定邮政编码分配纬度和经度的数据库,这些坐标通常是人为选择的,作为该邮政编码所服务区域的质心的近似值。同样,这不是一个离散的位置。
  • 根据TZip 源代码,这些映射仅涵盖 7 个时区。他们忘记了也有邮政编码的美国领土,例如关岛。其他人,如波多黎各,被错误地映射到东部时区而不是大西洋时区。

所以我的建议是完全避免这种方法。相反,请使用此社区 wiki中描述的方法之一。

于 2013-05-02T22:18:44.857 回答