Sometimes administrators want to permanently delete posts and topics from the database. To make sure that this is done for a good reasons, administrators can do this only after one minute has passed since the post was deleted or immediately if another administrator does it.
I don’t think the guardian is the right place for the _reason method.
Also, if you call the cannot_permanently_delete_post_reason method, that’s because you’ve already called the cannot_permanently_delete_post? and it returned true. So you don’t need to repeat all the tests, only the ones you want to display a message for.
The way I see these _reason methods is that they return a correct result only if the user cannot delete the object, but they should be. Looking at can_delete_category? and this method, topic_count == 0 is a possibility only if the user is not an admin and cannot edit the category.