Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Rails abstraction of word-based slugs for URLs, w/ or w/o leading numeric IDs.
branch: master

Ensure to_param always returns a string

URL helpers assume to_param returns a string and raise a type error if
this is not true.

Signed-off-by: Jose Fernandez <>
latest commit 67811d5a26
@therubymug therubymug authored Jose Fernandez committed
Failed to load latest commit information.
lib Ensure to_param always returns a string
test Ensure to_param always returns a string
README.markdown Revert "added scope column: 2 models can have the same slug if their …
Rakefile Initial import
init.rb Require the plugin lib in the initializer



Abstraction of word-based slugs for URLs, w/ or w/o leading numeric IDs.


  • Using Rails 2.1+
./script/plugin install git://


  • SaltySlugs defaults to title as the source_column, slug as the slug_column, and prepends the model ID. Upon creating/updating a record, the plugin will sluggify the source_column when the slug_column is empty, otherwise it will sluggify the slug_column unless the slug_sync option is set to true (defaults to false).
class Post < ActiveRecord::Base
post = Post.create(:title => "Do Not Mix Slugs and Salt!")
=> '23-do-not-mix-slugs-and-salt'
  • You can also overwrite the defaults
class Product < ActiveRecord::Base
   has_slug :source_column => :name, :slug_column => :permalink, :prepend_id => false
@product = Product.create(:name => "Salt and Pepper Shaker")
=> 'salt-and-pepper-shaker'
  • Use the slugged_find class method in your controllers, smart enough to modify the search conditions if prepending ID is found or not. slugged_find is capable of accepting standard ActiveRecord::Base#find options as a second parameter. If no records are found, ActiveRecord::RecordNotFound is raised to match behavior of ActiveRecord::Base#find.
class PostsController < ApplicationController

   def show
     @post = Post.slugged_find(params[:id])
     # or optionally with an eager-load
     @post_with_author = Post.slugged_find(params[:id], :include => :author)
   # catch exceptions if post is not found
   rescue ActiveRecord::RecordNotFound
     flash[:error] = "Post not found"
     redirect_to :action => :index
  • If the sync_slug option is set to true, the source_column will always be sluggified upon updating the record. This means that the slug will not be able to be manually edited, but will always be synchronized to the source_column.


  • Add a word/regexp blacklist, so that they are sliced out of a string when sluggified (for example to remove .com, .net, etc)

Copyright (c) 2008 Norbauer Inc, released under the MIT license
Written by Jonathan Dance and Jose Fernandez

Something went wrong with that request. Please try again.