【问题标题】:time type field getting bad default datetime if it is invalid如果时间类型字段无效,则默认日期时间会变差
【发布时间】:2012-09-04 12:06:23
【问题描述】:

糟糕的标题,但这是我的:

Loading development environment (Rails 3.2.8)
1.9.3p194 :001 > Product
 => Product(id: integer, name: string, date: datetime, created_at: datetime, updated_at: datetime, end_time: datetime, start_time: time) 
1.9.3p194 :002 > p = Product.new
 => #<Product id: nil, name: nil, date: nil, created_at: nil, updated_at: nil, end_time: nil, start_time: nil> 
1.9.3p194 :003 > p.start_time = "foo"
 => "foo" 
1.9.3p194 :004 > p.start_time
 => 2000-01-01 00:00:00 UTC 

我不希望将无效时间解析为有效时间。这导致我在表单提交中的验证出现问题。

这有点相关:Rails 3 - Validation for Time existence

并在 github 中导致此问题:https://github.com/rails/rails/issues/6045

我试着用眼睛追踪代码,但除了“foo”不应该解析并且它应该返回 nil 之外,什么都没有弹出。

编辑:我创建了一个示例应用程序来显示此确切行为https://github.com/danbeaulieu/test-app

但实际上它只是一个具有单一模型的简单应用。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation activerecord


    【解决方案1】:

    您可以使用validates_timeliness 来验证日期、时间和日期时间。

    然后在你的模型中你可以做

    validates_time :start_time
    

    或者看看我的GIST 来处理默认日期验证

    【讨论】:

    • 啊哈,是的,我正在尝试使用该 gem,但是,当该字段被验证时,它已经变成了一个有效的(虽然不正确的)日期时间。
    • 转换为 datetime 是一个不错的方法,我更喜欢它而不是使用这个 gem,因为 activerecord 更有能力处理验证。如果你有只存储时间的硬线,那就去买宝石吧。否则 datetime ---> UI 的时间转换不会是一件大事:)
    • 我不确定我是否遵循。我没有转换任何东西,一些轨道正在转换“foo”->“2000-01-01 00:00:00 UTC”。无论验证如何,我的控制台会话中的上述行为似乎都不合逻辑。要么我做错了,要么有错误。
    • @Dan.StackOverflow 如果提供的属性不符合预期,您看到的日期是 Rails 在数据库中存储的默认日期。我已经为这种默认场景的自定义验证创建了一个 GIST。我希望它可以帮助gist.github.com/3621130
    • 太棒了,非常感谢您的耐心等待。但是,该日期时间仍然是一个有效值,因此很难将其称为无效。如果这是解决方案,对我来说似乎是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 2012-12-07
    • 2021-10-25
    • 2021-01-01
    • 2012-02-29
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多