J'ai un rappel after_destroy
que je m'attendrais à renvoyer nil
mais qui a toujours une valeur.
class WeighIn < ActiveRecord::Base
belongs_to :check_in
after_destroy :add_employee_weightloss
def add_employee_weightloss
p self.check_in.weigh_in.present? # returns true
end
end
Spécifications :
it "employee weightloss" do
ci = CheckIn.create()
wi = WeighIn.create(check_in_id: ci.id)
wi.destroy
expect(wi.reload).to eq(nil) # returns wi instead of nil
end
1 réponse
Vous devez utiliser destroyed?
(ou exists?
, ou persisted?
) à la place, car present?
vérifie simplement si l'objet est présent, ce qui est le comportement correct après la destruction (destroy
lui-même renvoie l'objet supprimé).
def add_employee_weightloss
p check_in.weigh_in.destroyed?
end
Vous ne devez pas non plus utiliser les éléments suivants :
expect(wi.reload).to eq(nil)
Car si wi
a été détruit, vous obtiendrez une exception ActiveRecord::RecordNotFound
au lieu de nil
. Vous pouvez essayer ce qui suit :
it "employee weightloss" do
wi = WeighIn.create(check_in: CheckIn.create)
wi.destroy
expect(wi.destroyed?).to eq(true)
end
Questions connexes
De nouvelles questions
ruby-on-rails
Ruby on Rails est un framework d'application web open source à pile complète écrit en Ruby. Il suit le modèle de framework MVC populaire et est connu pour son approche "convention sur configuration" pour le développement d'applications.