diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index c5c3111ba2775bf39be48bf4bea5a654085ccc9a..9047ba10b547d2e7e50eee88cf6b7236dbf9d693 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1139,9 +1139,6 @@ Rails/SaveBang:
     - 'spec/requests/api/notes_spec.rb'
     - 'spec/requests/api/pipeline_schedules_spec.rb'
     - 'spec/requests/api/project_import_spec.rb'
-    - 'spec/requests/api/project_milestones_spec.rb'
-    - 'spec/requests/api/projects_spec.rb'
-    - 'spec/requests/api/snippets_spec.rb'
     - 'spec/requests/git_http_spec.rb'
     - 'spec/requests/lfs_http_spec.rb'
     - 'spec/requests/profiles/notifications_controller_spec.rb'
diff --git a/changelogs/unreleased/rails-save-bang-30.yml b/changelogs/unreleased/rails-save-bang-30.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7c2fdd3cdfbc662e6e8102c547a6c85ba9a94442
--- /dev/null
+++ b/changelogs/unreleased/rails-save-bang-30.yml
@@ -0,0 +1,5 @@
+---
+title: Fix Rails/SaveBang offenses for 3 files
+merge_request: 41394
+author: Rajendra Kadam
+type: other
diff --git a/spec/requests/api/project_milestones_spec.rb b/spec/requests/api/project_milestones_spec.rb
index d1e5df66b3f7116dc573d151daa5f07bf3a65d2b..71535e66353c718b1345aa58ec61edaaf2c7039d 100644
--- a/spec/requests/api/project_milestones_spec.rb
+++ b/spec/requests/api/project_milestones_spec.rb
@@ -43,7 +43,7 @@
         let(:milestones) { [group_milestone, ancestor_group_milestone, milestone, closed_milestone] }
 
         before_all do
-          project.update(namespace: group)
+          project.update!(namespace: group)
         end
 
         it_behaves_like 'listing all milestones'
@@ -108,7 +108,7 @@
     let(:group) { create(:group) }
 
     before do
-      project.update(namespace: group)
+      project.update!(namespace: group)
     end
 
     context 'when user does not have permission to promote milestone' do
@@ -163,7 +163,7 @@
 
     context 'when project does not belong to group' do
       before do
-        project.update(namespace: user.namespace)
+        project.update!(namespace: user.namespace)
       end
 
       it 'returns 403' do
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 46340f86f69f54f68289b0d690f3017eb0507bb5..df95835ae94f5943a7e40dad153bc107ed979f24 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -208,7 +208,7 @@
       end
 
       it 'does not include projects marked for deletion' do
-        project.update(pending_delete: true)
+        project.update!(pending_delete: true)
 
         get api('/projects', user)
 
@@ -502,7 +502,7 @@
 
         before do
           project_member
-          user3.update(starred_projects: [project, project2, project3, public_project])
+          user3.update!(starred_projects: [project, project2, project3, public_project])
         end
 
         it 'returns the starred projects viewable by the user' do
@@ -523,7 +523,7 @@
         let!(:project9) { create(:project, :public, path: 'gitlab9') }
 
         before do
-          user.update(starred_projects: [project5, project7, project8, project9])
+          user.update!(starred_projects: [project5, project7, project8, project9])
         end
 
         context 'including owned filter' do
@@ -1232,7 +1232,7 @@
 
   describe 'GET /users/:user_id/starred_projects/' do
     before do
-      user3.update(starred_projects: [project, project2, project3])
+      user3.update!(starred_projects: [project, project2, project3])
     end
 
     it 'returns error when user not found' do
@@ -1745,7 +1745,7 @@
       end
 
       it 'returns 404 when project is marked for deletion' do
-        project.update(pending_delete: true)
+        project.update!(pending_delete: true)
 
         get api("/projects/#{project.id}", user)
 
@@ -2260,7 +2260,7 @@
     end
 
     it "returns a 400 error when sharing is disabled" do
-      project.namespace.update(share_with_group_lock: true)
+      project.namespace.update!(share_with_group_lock: true)
       post api("/projects/#{project.id}/share", user), params: { group_id: group.id, group_access: Gitlab::Access::DEVELOPER }
       expect(response).to have_gitlab_http_status(:bad_request)
     end
@@ -2417,7 +2417,7 @@
       end
 
       it 'updates visibility_level from public to private' do
-        project3.update({ visibility_level: Gitlab::VisibilityLevel::PUBLIC })
+        project3.update!({ visibility_level: Gitlab::VisibilityLevel::PUBLIC })
         project_param = { visibility: 'private' }
 
         put api("/projects/#{project3.id}", user), params: project_param
@@ -2877,8 +2877,8 @@
     let(:private_user) { create(:user, private_profile: true) }
 
     before do
-      user.update(starred_projects: [public_project])
-      private_user.update(starred_projects: [public_project])
+      user.update!(starred_projects: [public_project])
+      private_user.update!(starred_projects: [public_project])
     end
 
     it 'returns not_found(404) for not existing project' do
diff --git a/spec/requests/api/snippets_spec.rb b/spec/requests/api/snippets_spec.rb
index 02f62b031701ce74c25377b6482ad530f0ad0312..508a39ce227d3a947e5345f6a754c8829be4ba30 100644
--- a/spec/requests/api/snippets_spec.rb
+++ b/spec/requests/api/snippets_spec.rb
@@ -111,7 +111,7 @@
     end
 
     it 'returns 404 for invalid snippet id' do
-      snippet.destroy
+      snippet.destroy!
 
       get api("/snippets/#{snippet.id}/raw", author)
 
@@ -201,7 +201,7 @@
       end
 
       it 'returns 404 for invalid snippet id' do
-        private_snippet.destroy
+        private_snippet.destroy!
 
         subject