FIX: Undefined method when serializing a user

FIX: Undefined method when serializing a user

Apparently is is possible to have a user without a user_profile. This fix will return nil for any user_profile fields during serialization (like the after delete web hook) instead of blowing up.

diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index a093c83..6b294c3 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -220,15 +220,15 @@ class UserSerializer < BasicUserSerializer
   end
 
   def bio_raw
-    object.user_profile.bio_raw
+    object.user_profile&.bio_raw
   end
 
   def bio_cooked
-    object.user_profile.bio_processed
+    object.user_profile&.bio_processed
   end
 
   def website
-    object.user_profile.website
+    object.user_profile&.website
   end
 
   def website_name
@@ -246,7 +246,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def location
-    object.user_profile.location
+    object.user_profile&.location
   end
 
   def can_edit
@@ -300,7 +300,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def bio_excerpt
-    object.user_profile.bio_excerpt(350 , keep_newlines: true, keep_emoji_images: true)
+    object.user_profile&.bio_excerpt(350 , keep_newlines: true, keep_emoji_images: true)
   end
 
   def include_suspend_reason?
@@ -470,7 +470,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def profile_view_count
-    object.user_profile.views
+    object.user_profile&.views
   end
 
   def time_read
diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb
index 7f896a2..a02d4e9 100644
--- a/spec/serializers/user_serializer_spec.rb
+++ b/spec/serializers/user_serializer_spec.rb
@@ -250,4 +250,17 @@ describe UserSerializer do
       expect(json[:user_api_keys][2][:id]).to eq(user_api_key_2.id)
     end
   end
+
+  context "with missing user profile" do
+    fab!(:user) { Fabricate(:user) }
+
+    it "does not throw an error" do
+      id = user.id
+      UserProfile.delete(id)
+      user_b = User.find(id)
+      json = UserSerializer.new(user_b, scope: Guardian.new(user_b), root: false).as_json
+
+      expect(json[:bio_raw]).to eq nil
+    end
+  end
 end

GitHub sha: 1fbe078a

1 Like

I don’t think this should be possible. Can we find out which code path is causing this?

Revert "FIX: Undefined method when serializing a user"