Module: FriendlyId::ClassMethods

Defined in:
lib/friendly_id.rb

Instance Method Summary collapse

Instance Method Details

#has_friendly_id(column, options = {}, &block) ⇒ Object

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 false. 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.

  • :strip_diacritics - Defaults to false. If true, it will remove accents, umlauts, etc. from western characters.

  • :strip_non_ascii - Defaults to false. If true, it will all non-ascii ([^a-z0-9]) 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 be treated the same as if that slug was already taken (numeric extension will be appended). 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 slugnormalization 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


59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/friendly_id.rb', line 59

def has_friendly_id(column, options = {}, &block)
  options.assert_valid_keys VALID_FRIENDLY_ID_KEYS
  options = DEFAULT_FRIENDLY_ID_OPTIONS.merge(options).merge(:column => column)
  write_inheritable_attribute :friendly_id_options, options
  class_inheritable_accessor :friendly_id_options
  class_inheritable_reader :slug_normalizer_block

  if options[:use_slug]
    has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy
    require 'friendly_id/sluggable_class_methods'
    require 'friendly_id/sluggable_instance_methods'
    extend SluggableClassMethods
    include SluggableInstanceMethods
    before_save :set_slug
    if block_given?
      write_inheritable_attribute :slug_normalizer_block, block
    end
  else
    require 'friendly_id/non_sluggable_class_methods'
    require 'friendly_id/non_sluggable_instance_methods'
    extend NonSluggableClassMethods
    include NonSluggableInstanceMethods
    validate :validate_friendly_id
  end
end