diff --git a/callbacks/callmethod.go b/callbacks/callmethod.go index 900f0fcb..0f911d66 100644 --- a/callbacks/callmethod.go +++ b/callbacks/callmethod.go @@ -15,12 +15,16 @@ func callMethod(db *gorm.DB, fc func(value interface{}, tx *gorm.DB) bool) { for i := 0; i < db.Statement.ReflectValue.Len(); i++ { if value := reflect.Indirect(db.Statement.ReflectValue.Index(i)); value.CanAddr() { fc(value.Addr().Interface(), tx) + } else { + db.AddError(gorm.ErrInvalidValue) } db.Statement.CurDestIndex++ } case reflect.Struct: if db.Statement.ReflectValue.CanAddr() { fc(db.Statement.ReflectValue.Addr().Interface(), tx) + } else { + db.AddError(gorm.ErrInvalidValue) } } } diff --git a/tests/hooks_test.go b/tests/hooks_test.go index 13c54dab..0753dd0b 100644 --- a/tests/hooks_test.go +++ b/tests/hooks_test.go @@ -534,22 +534,34 @@ func TestUpdateCallbacks(t *testing.T) { p := Product5{Name: "unique_code"} DB.Model(&Product5{}).Create(&p) - DB.Model(&Product5{}).Where("id", p.ID).Update("name", "update_name_1") + err := DB.Model(&Product5{}).Where("id", p.ID).Update("name", "update_name_1").Error + if err != nil { + t.Fatalf("should update success, but got err %v", err) + } if beforeUpdateCall != 1 { t.Fatalf("before update should be called") } - DB.Model(Product5{}).Where("id", p.ID).Update("name", "update_name_2") + err = DB.Model(Product5{}).Where("id", p.ID).Update("name", "update_name_2").Error + if !errors.Is(err, gorm.ErrInvalidValue) { + t.Fatalf("should got RecordNotFound, but got %v", err) + } if beforeUpdateCall != 1 { t.Fatalf("before update should not be called") } - DB.Model([1]*Product5{&p}).Update("name", "update_name_3") + err = DB.Model([1]*Product5{&p}).Update("name", "update_name_3").Error + if err != nil { + t.Fatalf("should update success, but got err %v", err) + } if beforeUpdateCall != 2 { t.Fatalf("before update should be called") } - DB.Model([1]Product5{p}).Update("name", "update_name_4") + err = DB.Model([1]Product5{p}).Update("name", "update_name_4").Error + if !errors.Is(err, gorm.ErrInvalidValue) { + t.Fatalf("should got RecordNotFound, but got %v", err) + } if beforeUpdateCall != 2 { t.Fatalf("before update should not be called") }