making it more convenient to be plural

Friday, May 23, 2008, at 06:17PM

By Eric Richardson

Hello again neglected blog...

Ever since the April 1st launch of the new blogdowntown code, there's been a sloppy little bug that's bothered me, but not quite been bad enough to address. When putting comment counts on stories, I got sloppy and wrote:

<%= thumbnail.comments.length %> Comments

instead of being proper and making sure account for the singular case. Bottom-line: the conditional is ugly. I didn't want to have to write this everywhere:

  story.comments.length.to_s + " " +  
  (story.comments.length == 1) ? "Comment" : "Comments" 

So tonight I finally made the fix, but did it in a way that doesn't assault my senses.

I figure the number knows whether it equals one or not, so why can't I just ask it to decide my case for me?

class Integer
  def pluralize(term)
    if self == 0
      n = (term[0] >= 65 && term[0] <= 90) ? "N" : "n"
      return "#{n}o #{Inflector.pluralize(term)}"
    elsif self == 1
      return "#{self.to_s} #{term}"
      return "#{self.to_s} #{Inflector.pluralize(term)}"

I plopped that in application.rb, and now I can do fun things like:

1.pluralize("Comment") # "1 Comment"
5.pluralize("Comment") # "5 Comments"
0.pluralize("Story") # "No Stories"
0.pluralize("story") # "no stories"

I don't have the situation where I need case determined on any words that Rails' default Inflector rules would bork on, but if I did I assume I could just define them the standard way.