lib/friendly_id.rb in friendly_id4-4.0.0.pre vs lib/friendly_id.rb in friendly_id4-4.0.0.pre3
- old
+ new
@@ -1,121 +1,14 @@
+require "friendly_id/base"
+require "friendly_id/model"
+require "friendly_id/object_utils"
+require "friendly_id/configuration"
+require "friendly_id/finder_methods"
+
# FriendlyId is a comprehensive Ruby library for ActiveRecord permalinks and
# slugs.
# @author Norman Clarke
module FriendlyId
-
- autoload :Slugged, "friendly_id/slugged"
- autoload :Scoped, "friendly_id/scoped"
-
- # Class methods that will be added to ActiveRecord::Base.
- module Base
- extend self
-
- def has_friendly_id(*args)
- options = args.extract_options!
- base = args.shift
- friendly_id_config.set options.merge(:base => base)
- include Model
- # @NOTE: AR-specific code here
- validates_exclusion_of base, :in => Configuration::DEFAULTS[:reserved_words]
- before_save do |record|
- record.instance_eval {@_current_friendly_id = friendly_id}
- end
- end
-
- def friendly_id_config
- @friendly_id_config ||= Configuration.new(self)
- end
-
- def uses_friendly_id?
- !! @friendly_id_config
- end
- end
-
- # Instance methods that will be added to all classes using FriendlyId.
- module Model
-
- # Convenience method for accessing the class method of the same name.
- def friendly_id_config
- self.class.friendly_id_config
- end
-
- # Get the instance's friendly_id.
- def friendly_id
- send friendly_id_config.query_field
- end
-
- # Either the friendly_id, or the numeric id cast to a string.
- def to_param
- (friendly_id or id).to_s
- end
- end
-
- # The configuration paramters passed to +has_friendly_id+ will be stored
- # in this object.
- class Configuration
- attr_accessor :base
- attr_reader :klass
-
- DEFAULTS = {
- :config_error_message => 'FriendlyId has no such config option "%s"',
- :reserved_words => ["new", "edit"]
- }
-
- def initialize(klass, values = nil)
- @klass = klass
- set values
- end
-
- def method_missing(symbol, *args, &block)
- option = symbol.to_s.gsub(/=\z/, '')
- raise ArgumentError, DEFAULTS[:config_error_message] % option
- end
-
- def set(values)
- values and values.each {|name, value| self.send "#{name}=", value}
- end
-
- def query_field
- base
- end
- end
-
- # Utility methods that are in Object because it's impossible to predict what
- # kinds of objects get passed into FinderMethods#find_one and
- # Model#normalize_friendly_id.
- module ObjectUtils
-
- # True is the id is definitely friendly, false if definitely unfriendly,
- # else nil.
- def friendly_id?
- if kind_of?(Integer) or kind_of?(Symbol) or self.class.respond_to? :friendly_id_config
- false
- elsif to_i.to_s != to_s
- true
- end
- end
-
- # True if the id is definitely unfriendly, false if definitely friendly,
- # else nil.
- def unfriendly_id?
- val = friendly_id? ; !val unless val.nil?
- end
- end
-
- # These methods will override the finder methods in ActiveRecord::Relation.
- module FinderMethods
-
- protected
-
- # @NOTE AR-specific code here
- def find_one(id)
- return super if !@klass.uses_friendly_id? or id.unfriendly_id?
- where(@klass.friendly_id_config.query_field => id).first or super
- end
-
- end
+ autoload :Slugged, "friendly_id/slugged"
+ autoload :Scoped, "friendly_id/scoped"
+ autoload :History, "friendly_id/history"
end
-
-ActiveRecord::Base.extend FriendlyId::Base
-ActiveRecord::Relation.send :include, FriendlyId::FinderMethods
-Object.send :include, FriendlyId::ObjectUtils