Extensions to nil
which allow for more helpful error messages
for people who are new to Rails.
Ruby raises NoMethodError if you invoke a method on an object that does not respond to it:
$ ruby -e nil.destroy -e:1: undefined method `destroy' for nil:NilClass (NoMethodError)
With these extensions, if the method belongs to the public interface of the classes in NilClass::WHINERS the error message suggests which could be the actual intended class:
$ rails runner nil.destroy ... You might have expected an instance of ActiveRecord::Base. ...
#id exists in Ruby 1.8 (though it
is deprecated). Since id
is a fundamental method of Active
Record models #id is redefined as
well to raise a RuntimeError and warn the user. She probably wanted a model
database identifier and the 4 returned by the original method could result
in obscure bugs.
The flag config.whiny_nils
determines whether this feature is
enabled. By default it is on in development and test modes, and it is off
in production mode.
# File lib/active_support/whiny_nil.rb, line 30 def self.add_whiner(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
# File lib/active_support/json/encoding.rb, line 168 def as_json(options = nil) AS_JSON end
Raises a RuntimeError when you attempt to call id
on
nil
.
# File lib/active_support/whiny_nil.rb, line 39 def id raise RuntimeError, "Called id for nil, which would mistakenly be #{object_id} -- if you really wanted the id of nil, use object_id", caller end
# File lib/active_support/core_ext/object/to_param.rb, line 11 def to_param self end