Added Object#presence that returns the object if it's #present? otherwise returns nil [DHH/Colin Kelley]

This commit is contained in:
David Heinemeier Hansson 2009-12-27 17:54:43 -08:00
parent a642edbef3
commit 1c47d04ea5
3 changed files with 29 additions and 4 deletions

@ -1,5 +1,7 @@
*Edge* *Edge*
* Added Object#presence that returns the object if it's #present? otherwise returns nil [DHH/Colin Kelley]
* Add Enumerable#exclude? to bring parity to Enumerable#include? and avoid if !x.include?/else calls [DHH] * Add Enumerable#exclude? to bring parity to Enumerable#include? and avoid if !x.include?/else calls [DHH]
* Update Edinburgh TimeZone to use "Europe/London" instead of "Europe/Dublin" #3310 [Phil Ross] * Update Edinburgh TimeZone to use "Europe/London" instead of "Europe/Dublin" #3310 [Phil Ross]

@ -2,11 +2,11 @@ class Object
# An object is blank if it's false, empty, or a whitespace string. # An object is blank if it's false, empty, or a whitespace string.
# For example, "", " ", +nil+, [], and {} are blank. # For example, "", " ", +nil+, [], and {} are blank.
# #
# This simplifies # This simplifies:
# #
# if !address.nil? && !address.empty? # if !address.nil? && !address.empty?
# #
# to # ...to:
# #
# if !address.blank? # if !address.blank?
def blank? def blank?
@ -17,6 +17,24 @@ def blank?
def present? def present?
!blank? !blank?
end end
# Returns object if it's #present? otherwise returns nil.
# object.presence is equivalent to object.present? ? object : nil.
#
# This is handy for any representation of objects where blank is the same
# as not present at all. For example, this simplifies a common check for
# HTTP POST/query parameters:
#
# state = params[:state] if params[:state].present?
# country = params[:country] if params[:country].present?
# region = state || country || 'US'
#
# ...becomes:
#
# region = params[:state].presence || params[:country].presence || 'US'
def presence
self if present?
end
end end
class NilClass #:nodoc: class NilClass #:nodoc:

@ -14,12 +14,17 @@ class BlankTest < Test::Unit::TestCase
NOT = [ EmptyFalse.new, Object.new, true, 0, 1, 'a', [nil], { nil => 0 } ] NOT = [ EmptyFalse.new, Object.new, true, 0, 1, 'a', [nil], { nil => 0 } ]
def test_blank def test_blank
BLANK.each { |v| assert v.blank?, "#{v.inspect} should be blank" } BLANK.each { |v| assert v.blank?, "#{v.inspect} should be blank" }
NOT.each { |v| assert !v.blank?, "#{v.inspect} should not be blank" } NOT.each { |v| assert !v.blank?, "#{v.inspect} should not be blank" }
end end
def test_present def test_present
BLANK.each { |v| assert !v.present?, "#{v.inspect} should not be present" } BLANK.each { |v| assert !v.present?, "#{v.inspect} should not be present" }
NOT.each { |v| assert v.present?, "#{v.inspect} should be present" } NOT.each { |v| assert v.present?, "#{v.inspect} should be present" }
end
def test_presence
BLANK.each { |v| assert_equal nil, v.presence, "#{v.inspect}.presence should return nil" }
NOT.each { |v| assert_equal v, v.presence, "#{v.inspect}.presence should return self" }
end end
end end