comparaison de la date avec ActiveSupport :: TimeWithZone a échoué
J'ai un age
méthode sur mon Waiver
modèle qui ressemble à:
def age(date = nil)
if date.nil?
date = Date.today
end
age = 0
unless date_of_birth.nil?
age = date.year - date_of_birth.year
age -= 1 if date < date_of_birth + age.years #for days before birthday
end
return age
end
Je puis avoir une spécification qui ressemble à:
it "calculates the proper age" do
waiver = FactoryGirl.create(:waiver, date_of_birth: 12.years.ago)
waiver.age.should == 12
end
Lorsque j'exécute ce spec-je obtenir comparison of Date with ActiveSupport::TimeWithZone failed
. Ce que je fais mal?
Failures:
1) Waiver calculates the proper age
Failure/Error: waiver.age.should == 12
ArgumentError:
comparison of Date with ActiveSupport::TimeWithZone failed
# ./app/models/waiver.rb:132:in `<'
# ./app/models/waiver.rb:132:in `age'
# ./spec/models/waiver_spec.rb:23:in `block (2 levels) in <top (required)>'
source d'informationauteur Kyle Decot
Vous devez vous connecter pour publier un commentaire.
Vous comparez une instance de
Date
avec une instance deActiveSupport::TimeWithZone
dans l'expressiondate < date_of_birth + age.years
; ActiveSupport::TimeWithZone est, selon les docsun Temps-comme la classe, qui peut représenter un moment dans n'importe quel fuseau horaire. Vous ne peut tout simplement pas comparerDate
etTime
objets sans procéder à une sorte de conversion. EssayezDate.today < Time.now
sur une console; vous voyez une erreur similaire.Des Expressions comme
12.years.ago
et typique ActiveRecord les horodatages sont des instances de ActiveSupport::TimeWithZone. Vous êtes mieux de s'assurer que vous traitez uniquement avecTime
objets ouDate
objets, mais pas les deux dans cette méthode. Pour faire votre comparaison de date à date, l'expression pourrait plutôt être écrit comme: