public
Description: Rails abstraction of word-based slugs for URLs, w/ or w/o leading numeric IDs.
Homepage: http://norbauer.com
Clone URL: git://github.com/norbauer/salty_slugs.git
therubymug (author)
Thu Jan 08 12:45:49 -0800 2009
jfernandez (committer)
Thu Jan 08 15:29:44 -0800 2009
name age message
file MIT-LICENSE Thu May 01 19:02:37 -0700 2008 Initial import [Jose Fernandez]
file README.markdown Tue Sep 30 08:38:03 -0700 2008 Revert "added scope column: 2 models can have t... [jfernandez]
file Rakefile Thu May 01 19:02:37 -0700 2008 Initial import [Jose Fernandez]
file init.rb Mon Nov 17 20:52:38 -0800 2008 Require the plugin lib in the initializer [jfernandez]
directory lib/ Thu Jan 08 15:29:44 -0800 2009 Ensure to_param always returns a string URL he... [therubymug]
directory test/ Thu Jan 08 15:29:44 -0800 2009 Ensure to_param always returns a string URL he... [therubymug]
README.markdown

SaltySlugs

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

Installation

  • Using Rails 2.1+
./script/plugin install git://github.com/norbauer/salty_slugs.git

Instructions

  • 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
   has_slug
end
 
post = Post.create(:title => "Do Not Mix Slugs and Salt!")
@post.to_param
=> '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
end
 
@product = Product.create(:name => "Salt and Pepper Shaker")
@product.to_param
=> '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
   end
   
end
  • 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.

TODO

  • 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