Sha256: 725ba8455d19b4a04552ec1c9de67938e59f25ccea29ed89ba50c228e4629231

Contents?: true

Size: 1.97 KB

Versions: 4

Compression:

Stored size: 1.97 KB

Contents

module FriendlyId
  # Utility methods for determining whether any object is a friendly id.
  #
  # Monkey-patching Object is a somewhat extreme measure not to be taken lightly
  # by libraries, but in this case I decided to do it because to me, it feels
  # cleaner than adding a module method to {FriendlyId}. I've given the methods
  # names that unambigously refer to the library of their origin, which should
  # be sufficient to avoid conflicts with other libraries.
  module ObjectUtils

    # True if the id is definitely friendly, false if definitely unfriendly,
    # else nil.
    #
    # An object is considired "definitely unfriendly" if its class is or
    # inherits from ActiveRecord::Base, Array, Hash, NilClass, Numeric, or
    # Symbol.
    #
    # An object is considered "definitely friendly" if it responds to +to_i+,
    # and its value when cast to an integer and then back to a string is
    # different from its value when merely cast to a string:
    #
    #     123.friendly_id?                  #=> false
    #     :id.friendly_id?                  #=> false
    #     {:name => 'joe'}.friendly_id?     #=> false
    #     ['name = ?', 'joe'].friendly_id?  #=> false
    #     nil.friendly_id?                  #=> false
    #     "123".friendly_id?                #=> nil
    #     "abc123".friendly_id?             #=> true
    def friendly_id?
      # Considered unfriendly if this is an instance of an unfriendly class or
      # one of its descendants.
      unfriendly_classes = [ActiveRecord::Base, Array, Hash, NilClass, Numeric,
                            Symbol, TrueClass, FalseClass]

      if unfriendly_classes.detect {|klass| self.class <= klass}
        false
      elsif respond_to?(:to_i) && 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
end

Object.send :include, FriendlyId::ObjectUtils

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
friendly_id-5.0.0.beta4 lib/friendly_id/object_utils.rb
friendly_id-5.0.0.beta3 lib/friendly_id/object_utils.rb
friendly_id-5.0.0.beta2 lib/friendly_id/object_utils.rb
friendly_id-5.0.0.beta1 lib/friendly_id/object_utils.rb