require "friendly_id/helpers"
require "friendly_id/slug"
require "friendly_id/sluggable_class_methods"
require "friendly_id/sluggable_instance_methods"
require "friendly_id/non_sluggable_class_methods"
require "friendly_id/non_sluggable_instance_methods"
# FriendlyId is a comprehensive Ruby library for slugging and permalinks with
# ActiveRecord.
module FriendlyId
# Default options for has_friendly_id.
DEFAULT_OPTIONS = {
:max_length => 255,
:reserved => ["new", "index"],
:reserved_message => 'can not be "%s"'
}.freeze
# The names of all valid configuration options.
VALID_OPTIONS = (DEFAULT_OPTIONS.keys + [
:cache_column,
:scope,
:strip_diacritics,
:strip_non_ascii,
:use_slug
]).freeze
# This error is raised when it's not possible to generate a unique slug.
class SlugGenerationError < StandardError ; end
# Set up an ActiveRecord model to use a friendly_id.
#
# The column argument can be one of your model's columns, or a method
# you use to generate the slug.
#
# Options:
# * :use_slug - Defaults to nil. Use slugs when you want to use a non-unique text field for friendly ids.
# * :max_length - Defaults to 255. The maximum allowed length for a slug.
# * :cache_column - Defaults to nil. Use this column as a cache for generating to_param (experimental) Note that if you use this option, any calls to +attr_accessible+ must be made BEFORE any calls to has_friendly_id in your class.
# * :strip_diacritics - Defaults to nil. If true, it will remove accents, umlauts, etc. from western characters.
# * :strip_non_ascii - Defaults to nil. If true, it will remove all non-ASCII characters.
# * :reserved - Array of words that are reserved and can't be used as friendly_id's. For sluggable models, if such a word is used, it will raise a FriendlyId::SlugGenerationError. Defaults to ["new", "index"].
# * :reserved_message - The validation message that will be shown when a reserved word is used as a frindly_id. Defaults to '"%s" is reserved'.
#
# You can also optionally pass a block if you want to use your own custom
# slug normalization routines rather than the default ones that come with
# friendly_id:
#
# require "stringex"
# class Post < ActiveRecord::Base
# has_friendly_id :title, :use_slug => true do |text|
# # Use stringex to generate the friendly_id rather than the baked-in methods
# text.to_url
# end
# end
def has_friendly_id(method, options = {}, &block)
options.assert_valid_keys VALID_OPTIONS
options = DEFAULT_OPTIONS.merge(options).merge(:method => method)
write_inheritable_attribute :friendly_id_options, options
class_inheritable_accessor :friendly_id_options
class_inheritable_reader :slug_normalizer_block
write_inheritable_attribute(:slug_normalizer_block, block) if block_given?
if friendly_id_options[:use_slug]
extend SluggableClassMethods
include SluggableInstanceMethods
else
extend NonSluggableClassMethods
include NonSluggableInstanceMethods
end
end
end
class ActiveRecord::Base
extend FriendlyId
end