Class NilClass
In: lib/active_support/json/encoding.rb
lib/active_support/whiny_nil.rb
lib/active_support/core_ext/object/to_param.rb
lib/active_support/core_ext/object/duplicable.rb
lib/active_support/core_ext/object/blank.rb
lib/active_support/core_ext/object/try.rb
Parent: Object

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.

Methods

add_whiner   as_json   blank?   duplicable?   id   to_param   try  

Constants

AS_JSON = ActiveSupport::JSON::Variable.new('null').freeze
METHOD_CLASS_MAP = Hash.new

Public Class methods

Public Instance methods

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)

[Validate]