I recently watched a presentation by Bryan Helmkamp titled Refactoring Fat Models with Patterns. Bryan based his talk on his blog 7 Patterns to Refactor Fat ActiveRecord Models, in which he describes seven patterns used to simplify models and adhere to the Single Responsibility Principle. I highly recommend studying both these resources.
From the patterns Bryan described, the Form Object pattern struck a chord as it seemed to be an elegant solution for a problem I have developed multiple implementations for but never felt completely satisfied with the result. I refer to User Registration and the lesser issue of User Authentication.
Does User Registration Logic Belong in a Model?
IMHO, no because registration/signup is a one-off event for a User
yet code responsible for this remains in the User
class and must be accounted for whenever a User
object is instantiated during testing.
This becomes even more apparent when additional validation could be required during registration that rely on remote services (i.e. lookup the user’s IP against a spammer blacklist). Adding
this logic to the User model (be it in a method or ActiveRecord callback) adds external dependencies to the User
class which again must be accounted for during testing.