Module: Mongoid::Slug::ClassMethods

Defined in:
lib/mongoid/slug.rb

Instance Method Summary collapse

Instance Method Details

#default_slug_url_builderObject



108
109
110
# File 'lib/mongoid/slug.rb', line 108

def default_slug_url_builder
  Mongoid::Slug.default_slug || ->(cur_object) { cur_object.slug_builder.to_url }
end

#find_by_slug!(*args) ⇒ Array<Document>, Document

Find documents by slugs.

A document matches if any of its slugs match one of the supplied params.

A document matching multiple supplied params will be returned only once.

If any supplied param does not match a document a Mongoid::Errors::DocumentNotFound will be raised.

Examples:

Find by a slug.

Model.find_by_slug!('some-slug')

Find by multiple slugs.

Model.find_by_slug!('some-slug', 'some-other-slug')

Parameters:

  • args (Array<Object>)

    The slugs to search for.

Returns:

  • (Array<Document>, Document)

    The matching document(s).



152
153
154
# File 'lib/mongoid/slug.rb', line 152

def find_by_slug!(*args)
  with_default_scope.find_by_slug!(*args)
end

#look_like_slugs?(*args) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/mongoid/slug.rb', line 112

def look_like_slugs?(*args)
  with_default_scope.look_like_slugs?(*args)
end

#queryableObject



156
157
158
# File 'lib/mongoid/slug.rb', line 156

def queryable
  current_scope || Criteria.new(self) # Use Mongoid::Slug::Criteria for slugged documents.
end

#slug(*fields) { ... } ⇒ Object #slug(*fields, options) { ... } ⇒ Object

Examples:

A custom builder

class Person
  include Mongoid::Document
  include Mongoid::Slug

  field :names, :type => Array
  slug :names do |doc|
    doc.names.join(' ')
  end
end

Overloads:

  • #slug(*fields) { ... } ⇒ Object

    Sets one ore more fields as source of slug.

    Parameters:

    • fields (Array)

      One or more fields the slug should be based on.

    Yields:

    • If given, the block is used to build a custom slug.

  • #slug(*fields, options) { ... } ⇒ Object

    Sets one ore more fields as source of slug. the slug should be retained. When searched by slug, the document now matches both past and present slugs. immutable. Defaults to false. or array of fields to scope the slug by. Embedded documents are, by default, scoped by their parent. Now it supports not only a single association or field but also an array of them.

    Parameters:

    • fields (Array)

      One or more fields the slug should be based on.

    • options (Hash)
    • options (Boolean)

      :history Whether a history of changes to

    • options (Boolean)

      :permanent Whether the slug should be

    • options (Array)

      :reserve` A list of reserved slugs

    • options

      :scope [Symbol, Array] a reference association, field,

    • options

      :max_length [Integer] the maximum length of the text portion of the slug

    Yields:

    • If given, a block is used to build a slug.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/mongoid/slug.rb', line 78

def slug(*fields, &block)
  options = fields.extract_options!

  self.slug_scope            = options[:scope]
  self.slug_index            = options[:index].nil? || options[:index]
  self.slug_reserved_words   = options[:reserve] || Set.new(%w[new edit])
  self.slugged_attributes    = fields.map(&:to_s)
  self.slug_history          = options[:history]
  self.slug_by_model_type    = options[:by_model_type]
  self.slug_max_length       = options.key?(:max_length) ? options[:max_length] : MONGO_INDEX_KEY_LIMIT_BYTES - 32

  field :_slugs, type: Array, localize: options[:localize]
  alias_attribute :slugs, :_slugs

  # Set indexes
  if slug_index && !embedded?
    Mongoid::Slug::IndexBuilder.build_indexes(self, slug_scope_keys, slug_by_model_type, options[:localize])
  end

  self.slug_url_builder = block_given? ? block : default_slug_url_builder

  #-- always create slug on create
  #-- do not create new slug on update if the slug is permanent
  if options[:permanent]
    set_callback :create, :before, :build_slug
  else
    set_callback :save, :before, :build_slug, if: :slug_should_be_rebuilt?
  end
end

#slug_scope_keysArray<Document>, Document

Returns the scope keys for indexing, considering associations

Returns:

  • (Array<Document>, Document)


125
126
127
128
129
130
131
132
133
# File 'lib/mongoid/slug.rb', line 125

def slug_scope_keys
  return nil unless slug_scope

  # If slug_scope is an array, we map over its elements to get each individual scope's key.
  slug_scopes.map do |individual_scope|
    # Attempt to find the association and get its key. If no association is found, use the scope as-is.
    reflect_on_association(individual_scope).try(:key) || individual_scope
  end
end

#slug_scopesObject



116
117
118
119
120
# File 'lib/mongoid/slug.rb', line 116

def slug_scopes
  # If slug_scope is set (i.e., not nil), we convert it to an array to ensure we can handle it consistently.
  # If it's not set, we use an array with a single nil element, signifying no specific scope.
  slug_scope ? Array(slug_scope) : [nil]
end