17 Aug 2008, 2:02pm

by Ariejan de Vroom

Skinny Controllers and Overweight Models

All Rails developers know the slogan “Skinny Controllers, Fat Models” and I heartily agree with it. Every conference you go to, you hear it. But there’s a problem! My Fat models got overweight!

What happened? By stuffing all applications logic in the Models, they become fat, very fat. Although this is supposed to be a good thing, I don’t like it. My models get so fat that it takes me forever to scroll through it and find the method I’m working on. There must be a better way!

Well, yes there is: create modules! Normally you’d write a module to reuse your code in different places, but there’s no rule that says you may not use a module only once.

So, I package all related code (e.g. Authentication, state management, managing associated objects, etc) into different modules and place them in the /lib directory. Let’s say you have a a bunch of methods to handle keep a counter on your User model

Class User < ActiveRecord::Base
  attr_accessor :counter
 
  def up
    counter += 1
  end
 
  def down
    counter -= 1
  end
 
  def reset
    counter = 0
  end
end

You could create a new file lib/counter.rb and include that module in your User model.

Class User < ActiveRecord::Base
  attr_accessor :counter
  include Counter
end
module Counter
  def up
    counter += 1
  end
 
  def down
    counter -= 1
  end
 
  def reset
    counter = 0
  end
end

As you can see, this keeps your fat User model clean and makes it easier for you to find code that applies to a certain function.

Please share the love of this post by bookmarking it, and sharing it with others. Thanks!

  • Digg
  • del.icio.us
  • description
  • Reddit
  • Technorati
  • BlinkList
  • E-mail this story to a friend!
  • Facebook
  • Live
  • MisterWong
  • Netvouz
  • NewsVine
  • Slashdot
  • SphereIt
17 Aug 2008, 2:52pm
by Ariejan de Vroom


As an added note: if you use the same module more than once, you should consider creating a plugin or gem instead.

18 Aug 2008, 1:49pm
by James Urquhart


Interesting idea. Though i would have thought using it in a lot of single cases might get confusing after a while.

Personally i’d probably just find a decent code editor that allowed me to hide the code blocks. :)

*name

*e-mail

web site

leave a comment