Sha256: af875d8840a5e886886f1704edd250095dc4615a9abbccaa2c4f767d8fa17e09

Contents?: true

Size: 1.55 KB

Versions: 5

Compression:

Stored size: 1.55 KB

Contents

module Acts
  module Slugoid
    module ClassMethods
      #
      # Adds the logic to generate the slug
      #
      # Options:
      #
      #   :generate_from
      #       The name of the field used to generate the slug
      #
      #   :store_as
      #       The name of the field where the slug will be stored
      #
      def acts_as_slugoid(options = {})
        @acts_as_slugoid_options = {
          :generate_from => :name,
          :store_as => :slug
          }.merge(options)

          generate_from = @acts_as_slugoid_options[:generate_from]
          store_as = @acts_as_slugoid_options[:store_as]

          class_eval do
            before_save do
              generate_slug(generate_from, store_as)
            end

            field(store_as, :type => String) unless self.respond_to?(store_as)
            index(store_as)
            alias_method :to_param!, :to_param

            include InstanceMethods

            def self.acts_as_slugoid_options
              @acts_as_slugoid_options
            end

            def self.find_by_slug(slug)
              where(@acts_as_slugoid_options[:store_as] => slug).first
            end
          end

          define_method("to_param") do
            self.send(store_as)
          end
        end
      end

      module InstanceMethods
        def generate_slug(method, slug_field_name)
          self.send("#{slug_field_name.to_s}=", self.send(method).parameterize)
        end
      end

      def self.included(receiver)
        receiver::ClassMethods.send :include, ClassMethods
      end
    end
  end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
slugoid-0.2.0 lib/slugoid/acts/slugoid.rb
slugoid-0.1.1 lib/slugoid/acts/slugoid.rb
slugoid-0.1.0 lib/slugoid/acts/slugoid.rb
slugoid-0.0.5 lib/slugoid/acts/slugoid.rb
slugoid-0.0.4 lib/slugoid/acts/slugoid.rb