Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Rails abstraction of word-based slugs for URLs, w/ or w/o leading numeric IDs.
Ruby
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 <jose@umn.edu>
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
MIT-LICENSE
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

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

Something went wrong with that request. Please try again.