gpt4 book ai didi

ruby-on-rails - 验证时区在 Rails 中是否有效

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:35 24 4
gpt4 key购买 nike

我正在使用 tsjzt:http://pellepim.bitbucket.org/jstz/在客户端获取我存储在用户对象中的当前用户时区。

这很好用,并为我提供了像“欧洲/伦敦”这样的时区。我想在将其传递到模型时验证它是一个有效的时区,以防发生不好的事情。

所以我发现了这个问题:Issue validating user time zone for Rails app on Heroku并尝试了这个验证:

validates_inclusion_of :timezone, :in => { in: ActiveSupport::TimeZone.zones_map(&:name) }

但是名称与 tzinfo 不同。我认为我的客户端检测到的时区字符串“Europe/London”本质上是 TimeZone 类中 TimeZone 映射的值组件,而不是名称 - 在本例中将设置为“London”。

所以我尝试了这个:

validates_inclusion_of :timezone, :in => { in: ActiveSupport::TimeZone.zones_map(&:tzinfo) }

其他 SO 问题的原始答案或我用 :tzinfo 修改的答案都没有工作,因为当 :timezone 是“Europe/London”时,它们都无法通过验证,而显然这是一个有效的时区!

我在这个时区验证中做错了什么,我该如何解决?

最佳答案

看起来你想要这个:

validates_inclusion_of :timezone,
:in => ActiveSupport::TimeZone.all.map { |tz| tz.tzinfo.name }

在我的机器上,该列表包括以下名称:

...
"Europe/Istanbul",
"Europe/Kaliningrad",
"Europe/Kiev",
"Europe/Lisbon",
"Europe/Ljubljana",
"Europe/London",
...

但是,更简洁的解决方案是自定义验证方法,如下所示:

validates_presence_of :timezone
validate :timezone_exists

private

def timezone_exists
return if timezone? && ActiveSupport::TimeZone[timezone].present?
errors.add(:timezone, "does not exist")
end

它接受的值更加灵活:

ActiveSupport::TimeZone["London"].present? # => true
ActiveSupport::TimeZone["Europe/London"].present? # => true
ActiveSupport::TimeZone["Pluto"].present? # => false

关于ruby-on-rails - 验证时区在 Rails 中是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31792295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com