Sha256: 2362afa81340f9e984325a8e77a52bb0f0bc21f9a96eda55777c7c50f44d8ca0

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

module MongoMapperExt
  module Slugizer
    def self.included(klass)
      klass.class_eval do
        extend ClassMethods
        extend Finder

        key :slug, String, :index => true

        before_validation_on_create :generate_slug
      end
    end

    def to_param
      self.slug.blank? ? self.id : self.slug
    end

    protected
    def generate_slug
      if self.slug.blank?
        slug = self[self.class.slug_key].gsub(/[^A-Za-z0-9\s\-]/, "")[0,20].strip.gsub(/\s+/, "-").downcase
        if !self.class.slug_options[:unique]
          key = UUIDTools::UUID.random_create.hexdigest[0,4] #optimize
          self.slug = key+"-"+slug
        else
          self.slug = slug
        end
      end
    end

    module ClassMethods
      def slug_key(key = :name, options = {})
        @slug_options ||= options
        @slug_key ||= key
      end
      class_eval do
        attr_reader :slug_options
      end
    end

    module Finder
      def by_slug(id, options = {})
        self.find_by_slug(id, options) || self.first(options.merge({:_id => id}))
      end
      alias :find_by_slug_or_id :by_slug
    end
  end
end

if defined?(MongoMapper::Associations)
  MongoMapper::Associations::Proxy.send(:include, MongoMapperExt::Slugizer::Finder)
else
  MongoMapper::Plugins::Associations::Proxy.send(:include, MongoMapperExt::Slugizer::Finder)
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mongomapper_ext-0.1.3 lib/mongomapper_ext/slugizer.rb
mongomapper_ext-0.1.2 lib/mongomapper_ext/slugizer.rb