Delete a comment if the user does not exist Ruby on Rails

advertisements

I get an error undefined method 'email' for nil:NilClass when I try to access a post with a comment from a user that has been deleted in the DB.

I wonder: how can I remove the comments that has been created by users who no longer exists "on the fly"?

I tried something like this

<%= div_for(comment) do %>
    <% if comment.user.email.nil?%>
        <% comment.destroy %>
    <%else%>
        <p><%= comment.body %></p>
        <p class="comment-submitted-by"><%= time_ago_in_words(comment.created_at) %> ago by
        <%= comment.user.email %></p>
    <%end%>

but I still get the error.


You're still getting an error because you've referenced comment.user.email, and user is nil. You need to check comment.user.nil?, or you're also at risk for deleting a comment just because a user's email is missing (though maybe you disallow that):

<% if comment.user.nil? %>
  <% comment.destroy %>


Cleaning up on the fly is going to be finicky and cumbersome. What it looks like you want is dependent: :destroy on your User#comments association.

class User
  has_many :comments, dependent: :destroy
end

Then when your User is removed, all of their Comments will be too, and you don't have to worry about it at display time.

Since there are existing orphaned comments, you can clean them out with a simple SQL statement:

DELETE FROM comments WHERE user_id NOT IN (
  SELECT id FROM users
)

Or your Rails console:

Comments.find_each { |c| c.destroy if c.user.nil? }