我正在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
通过了简单的name
和email
验证(没有自定义验证)。
我该如何验证?我也应该在这里使用numericality
吗?
答案 0 :(得分:3)
即使starts_at
定义为presence
,当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
验证以记录错误。
var pdfBase64 = doc.output('datauristring');
$http({
method: "POST",
url: 'https://www.myserver.com/api/export-events',
params:
{current_user: $rootScope.currentuser,
pdf: pdfBase64}
}).then(function(data) {
console.log(data);
var alertPopup = $ionicPopup.alert({
title: "Export Successful!",
template: 'A PDF was sent to your email address.'
});