Slugify is a Rails plugin that automatically converts an attribute into a pretty URL slug and assigns it to another attribute. Conversion happens in a before_validation
filter or by manually calling the #slugify
or #slugify!
instance methods.
Internally, it uses ActiveSupport's #parameterize
method and is multi-byte safe.
By default, slugify generates the slug from the :title
attribute and assigns it to the :slug
attribute:
class Page < ActiveRecord::Base
slugify
end
@page = Page.new :title => "Yay Hooray"
@page.slugify
@page.slug # -> "yay-hooray"
Both fields can be overridden:
class User < ActiveRecord::Base
slugify :name, :to => :permalink
end
@user = User.new :name => "Fox Mulder"
@user.slugify
@user.permalink # -> "fox-mulder"
Slugify will only assign a slug if the :to
attribute is blank. This is to prevent all the URLs from breaking every time the user changes a title. Continuing from the example above:
@user.name = "Dana Scully"
@user.slugify
@user.permalink # -> "fox-mulder"
To override, use the #slugify!
instance method:
@user.name = "Dana Scully"
@user.slugify!
@user.permalink # -> "dana-scully"
or set the option in the DSL:
class Product < ActiveRecord::Base
slugify :title, :to => :permalink, :force => true
end
Slugify will automatically validate for presence, format, and uniqueness. It's easy to scope the uniqueness constraint:
class Page < ActiveRecord::Base
slugify :title, :scope => :section_id
end
or turn the constrain off:
class BlogPost < ActiveRecord::Base
slugify :title, :unique => false
end
To include the id in the slug, do it in the #to_param
method:
class Book < ActiveRecord::Base
slugify
def to_param
"#{id}-#{slug}"
end
end
Bonus! If you include the id first, you can pass the whole slug into #find
and it'll Just Work™:
Book.create(:title => "The Stand")
@book = Book.find("1-the-stand")
@book.title # -> "The Stand"
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2010 Chris Jones
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.