Search code examples
rubystringlowercasegsub

Ruby post title to slug


How should I convert a post title to a slug in Ruby?

The title can have any characters, but I only want the slug to allow [a-z0-9-_] (Should it allow any other characters?).

So basically:

  • downcase all letters
  • convert spaces to hyphens
  • delete extraneous characters

Solution

  • slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
    

    downcase makes it lowercase. The strip makes sure there is no leading or trailing whitespace. The first gsub replaces spaces with hyphens. The second gsub removes all non-alpha non-dash non-underscore characters (note that this set is very close to \W but includes the dash as well, which is why it's spelled out here).