Sha256: f96596b01b6aa37239dd4f950e930423a354310a26a123597e5f95790e856f55

Contents?: true

Size: 1.33 KB

Versions: 21

Compression:

Stored size: 1.33 KB

Contents

# Extensions to nil which allow for more helpful error messages for
# people who are new to rails.
#
# The aim is to ensure that when users pass nil to methods where that isn't
# appropriate, instead of NoMethodError and the name of some method used
# by the framework users will see a message explaining what type of object
# was expected.

class NilClass
  WHINERS = [::Array]
  WHINERS << ::ActiveRecord::Base if defined? ::ActiveRecord

  @@method_class_map = Hash.new

  WHINERS.each do |klass|
    methods = klass.public_instance_methods - public_instance_methods
    class_name = klass.name
    methods.each { |method| @@method_class_map[method.to_sym] = class_name }
  end

  def id
    raise RuntimeError, "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id", caller
  end

  private
    def method_missing(method, *args, &block)
      raise_nil_warning_for @@method_class_map[method], method, caller
    end

    def raise_nil_warning_for(class_name = nil, selector = nil, with_caller = nil)
      message = "You have a nil object when you didn't expect it!"
      message << "\nYou might have expected an instance of #{class_name}." if class_name
      message << "\nThe error occurred while evaluating nil.#{selector}" if selector

      raise NoMethodError, message, with_caller || caller
    end
end

Version data entries

21 entries across 21 versions & 4 rubygems

Version Path
activesupport-2.0.1 lib/active_support/whiny_nil.rb
activesupport-2.0.0 lib/active_support/whiny_nil.rb
activesupport-2.0.4 lib/active_support/whiny_nil.rb
activesupport-2.0.2 lib/active_support/whiny_nil.rb
activesupport-2.0.5 lib/active_support/whiny_nil.rb
radiant-0.6.5.1 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
radiant-0.6.5 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
radiant-0.6.7 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
radiant-0.6.6 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
radiant-0.6.8 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
radiant-0.6.9 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
spree-0.0.9 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
spree-0.2.0 vendor/rails/activesupport/lib/active_support/whiny_nil.rb
swivel-0.0.149 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.150 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.152 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.157 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.155 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.156 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb
swivel-0.0.175 vendor/activesupport-2.0.2-/lib/active_support/whiny_nil.rb