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. ...
NilClass#id exists in Ruby 1.8 (though it is deprecated). Since id is a fundamental method of Active Record models NilClass#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.
- A
- B
- D
- I
- T
AS_JSON | = | ActiveSupport::JSON::Variable.new('null').freeze |
METHOD_CLASS_MAP | = | Hash.new |
nil is blank:
nil.blank? # => true
nil is not duplicable:
nil.duplicable? # => false nil.dup # => TypeError: can't dup NilClass
Raises a RuntimeError when you attempt to call id on nil.
Calling try on nil always returns nil. It becomes specially helpful when navigating through associations that may return nil.
Examples
nil.try(:name) # => nil
Without try
@person && !@person.children.blank? && @person.children.first.name
With try
@person.try(:children).try(:first).try(:name)