gpt4 book ai didi

ruby-on-rails - 验证模型中的日期时间条目

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:47 26 4
gpt4 key购买 nike

我在 Rails 中使用数据库和模型,我有一个看起来像这样的“创建旅游”迁移

class CreateTours < ActiveRecord::Migration[5.2]
def change
create_table :tours do |t|
t.string :name
t.integer :price
t.datetime :starts_at
t.datetime :ends_at
end
end
end

我添加了一个模型Tour

class Tour < ApplicationRecord
has_many :bookings, dependent: :destroy

validates :name, presence: true,
uniqueness: { case_sensitive: false }
validates :starts_at, presence: true
validates :ends_at, presence: true
validates :price, presence: true,
numericality: { greater_than: 0 }

validate :end_time_is_valid

def end_time_is_valid
error_msg = 'Trip cannot ends before it began'
errors.add(:ends_at, error_msg) if ends_at < starts_at
end
end

然后我添加了 RSpec

RSpec.describe Tour do
subject do
described_class
.create(
name: 'Tour 1',
starts_at: Time.zone.now,
ends_at: Time.zone.now + 7200,
price: 200
)
end

let(:invalid_flight) do
described_class.create(
name: 'Tour 2',
starts_at: Time.zone.now,
ends_at: Time.zone.now - 7200,
price: 200
)
end

it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_presence_of(:starts_at) }
it { is_expected.to validate_presence_of(:ends_at) }
it { is_expected.to validate_presence_of(:price) }

it { is_expected.to have_many(:bookings) }
end

现在,我收到类似这样的错误

Flight should validate that :starts_at cannot be empty/falsy
Failure/Error: errors.add(:ends_at, error_msg) if ends_at < starts_at

ArgumentError:
comparison of ActiveSupport::TimeWithZone with nil failed
# ./app/models/tour.rb:18:in `<'
# ./app/models/tour.rb:18:in `end_time_is_valid'
# ./spec/models/tour_spec.rb:22:in `block (2 levels) in <main>'

我要添加的是验证结束游览时间不能早于开始游览时间。

但是自定义验证失败了,我不知道为什么。

我正在玩 Rails,但我不确定该怎么做。

我正在使用 shoulda-matchers 进行测试。

一些简单的模型,如 User,只有简单的 nameemail 验证通过(没有自定义验证)。

我如何验证这一点?我是否也应该在这里使用 numericality

最佳答案

即使您定义了 presence 验证,当 starts_at 为空/nil 时仍会调用您的验证:验证没有层次结构,因此失败可以'导致其他人被跳过。

因此,如果任一值为空,您的验证方法应该跳过检查——留下 presence 验证来记录错误。

def end_time_is_valid
return if starts_at.blank? || ends_at.blank?

error_msg = 'Trip cannot ends before it began'
errors.add(:ends_at, error_msg) if ends_at < starts_at
end

关于ruby-on-rails - 验证模型中的日期时间条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458114/

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