gpt4 book ai didi

ruby-on-rails - 在 Rails 中验证时间

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

我的应用有两次用户输入,为了方便用户,我计算了两次之间的时间。所以用户输入 1:00 AM 作为开始时间和 2:00 AM 作为停止时间,它会输出“1 小时”。我有一个辅助方法可以执行此操作,使用 gem 来完成繁重的工作。时间作为时间数据类型存储在数据库中,以便其正常工作。

一切正常,现在我想验证用户输入的时间是否有效——但也不需要它。因此,如果用户在那些时间没有输入任何内容,记录仍会保存 - 但如果用户输入,说“asdfasdf”,我希望验证被触发并说这是一个无效时间,而不是只是默默地不存储时间.

我像这样创建了自己的自定义时间验证:

class TimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
Time.parse(value.to_s)
rescue ArgumentError
record.errors[attribute] << (options[:message] || "is not a valid time")
end
end

然后在我的模型中,我正在做:

validates :start_time, time: true
validates :stop_time, time: true

就确保时间可以被正确解析而言,这做了我想要的,因为它工作得很好。用户可以输入 14:00、3:00 PM 等,Rails 可以解析它。如果他们输入“asdfasdf”或任何无法解析为有效时间的值,则会通过表单验证错误通知用户并且不会保存记录。

但就该代码而言,如果该值留空,它也会触发验证错误。

再一次,我希望它通过 nil 值的验证,但如果存在某些无法解析的值,则失败。

我试过:

validates :start_time, time: true, allow_blank: true

但随后“asdfasdf”将通过。我也试过了

Time.parse(value.to_s) unless value.nil?

但同样,这会破坏整个事情并允许通过无效日期。

有什么想法吗?

最佳答案

我必须首先承认我不是 Rails/Ruby 专家。

我今天遇到了同样的问题,我想我已经解决了。问题是 Rails 执行类型转换。如果输入无效参数(例如 starttime="asdf"),将创建一个虚拟时间对象。当您验证它时,似乎一切正常,但显然没有。您可以使用 :starttime_before_type_cast 访问“真实”参数值。

我相应地调整了 Yule 的代码:

class TimeValidator < ActiveModel::EachValidator

def validate_each(record, attribute, value)
return true unless value
begin
Time.parse(value.to_s)
rescue ArgumentError
y = attribute.to_s
y.slice! "_before_type_cast"
record.errors[y] << (options[:message] || "invalid time format entered")
end
end

end

模型中的验证应如下所示:

validates :starttime, presence: true
validates :starttime_before_type_cast, time: true

这种方法的唯一障碍是表单中的字段将包含时间 00:00 而不是验证后的格式错误的值。 IE。用户不会看到他输入的内容以及导致错误消息的原因。

An article about Rails Type Casting

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

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