class Object
Inherits From
-
class
BasicObject
-
module
Java
Public instance methods
An object is blank if it’s false, empty, or a whitespace string. For example, nil
, ”, ‘ ’, [], {}, and false
are all blank.
This simplifies
!address || address.empty?
to
address.blank?
@return [true, false]
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 18
def blank?
respond_to?(:empty?) ? !!empty? : false
end
Returns a deep copy of object if it’s duplicable. If it’s not duplicable, returns self
.
object = Object.new
dup = object.deep_dup
dup.instance_variable_set(:@a, 1)
object.instance_variable_defined?(:@a) # => false
dup.instance_variable_defined?(:@a) # => true
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 15
def deep_dup
duplicable? ? dup : self
end
Can you safely dup this object?
False for method objects; true otherwise.
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/duplicable.rb, line 26
def duplicable?
true
end
Source code GitHub
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 7
def html_safe?
false
end
Returns true if this object is included in the argument.
When argument is a Range
, #cover?
is used to properly handle inclusion check within open ranges. Otherwise, argument must be any object which responds to #include?
. Usage:
characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true
For non Range
arguments, this will throw an ArgumentError
if the argument doesn’t respond to #include?
.
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 15
def in?(another_object)
case another_object
when Range
another_object.cover?(self)
else
another_object.include?(self)
end
rescue NoMethodError
raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end
Returns a hash with string keys that maps instance variable names without “@” to their corresponding values.
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 14
def instance_values
instance_variables.to_h do |ivar|
[ivar[1..-1].freeze, instance_variable_get(ivar)]
end
end
Returns an array of instance variable names as strings including “@”.
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_variable_names # => ["@y", "@x"]
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 29
def instance_variable_names
instance_variables.map(&:name)
end
Returns the receiver if it’s present otherwise returns nil
. object.presence
is equivalent to
object.present? ? object : nil
For example, something like
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'
@return [Object]
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 45
def presence
self if present?
end
Returns the receiver if it’s included in the argument otherwise returns nil
. Argument must be any object which responds to #include?
. Usage:
params[:bucket_type].presence_in %w( project calendar )
This will throw an ArgumentError
if the argument doesn’t respond to #include?
.
@return [Object]
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 34
def presence_in(another_object)
in?(another_object) ? self : nil
end
An object is present if it’s not blank.
@return [true, false]
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 25
def present?
!blank?
end
Set and restore public attributes around a block.
client.timeout # => 5
client.with(timeout: 1) do |c|
c.timeout # => 1
end
client.timeout # => 5
The receiver is yielded to the provided block.
This method is a shorthand for the common begin/ensure pattern:
old_value = object.attribute
begin
object.attribute = new_value
# do things
ensure
object.attribute = old_value
end
It can be used on any object as long as both the reader and writer methods are public.
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/with.rb, line 26
def with(**attributes)
old_values = {}
begin
attributes.each do |key, value|
old_values[key] = public_send(key)
public_send("#{key}=", value)
end
yield self
ensure
old_values.each do |key, old_value|
public_send("#{key}=", old_value)
end
end
end
An elegant way to factor duplication out of options passed to a series of method calls. Each method called in the block, with the block variable as the receiver, will have its options merged with the default options
Hash
or Hash
-like object provided. Each method called on the block variable must take an options hash as its final argument.
Without with_options
, this code contains duplication:
class Account < ActiveRecord::Base
has_many :customers, dependent: :destroy
has_many :products, dependent: :destroy
has_many :invoices, dependent: :destroy
has_many :expenses, dependent: :destroy
end
Using with_options
, we can remove the duplication:
class Account < ActiveRecord::Base
with_options dependent: :destroy do |assoc|
assoc.has_many :customers
assoc.has_many :products
assoc.has_many :invoices
assoc.has_many :expenses
end
end
It can also be used with an explicit receiver:
I18n.with_options locale: user.locale, scope: 'newsletter' do |i18n|
subject i18n.t :subject
body i18n.t :body, user_name: user.name
end
When you don’t pass an explicit receiver, it executes the whole block in merging options context:
class Account < ActiveRecord::Base
with_options dependent: :destroy do
has_many :customers
has_many :products
has_many :invoices
has_many :expenses
end
end
with_options
can also be nested since the call is forwarded to its receiver.
NOTE: Each nesting level will merge inherited defaults in addition to their own.
class Post < ActiveRecord::Base
with_options if: :persisted?, length: { minimum: 50 } do
validates :content, if: -> { content.present? }
end
end
The code is equivalent to:
validates :content, length: { minimum: 50 }, if: -> { content.present? }
Hence the inherited default for if
key is ignored.
NOTE: You cannot call class methods implicitly inside of with_options
. You can access these methods using the class name instead:
class Phone < ActiveRecord::Base
enum :phone_number_type, { home: 0, office: 1, mobile: 2 }
with_options presence: true do
validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys }
end
end
When the block argument is omitted, the decorated Object instance is returned:
module MyStyledHelpers
def styled
with_options style: "color: red;"
end
end
styled.link_to "I'm red", "/"
# => <a href="/" style="color: red;">I'm red</a>
styled.button_tag "I'm red too!"
# => <button style="color: red;">I'm red too!</button>
Source code GitHub
# File activesupport/lib/active_support/core_ext/object/with_options.rb, line 92
def with_options(options, &block)
option_merger = ActiveSupport::OptionMerger.new(self, options)
if block
block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger)
else
option_merger
end
end
Definition files
activesupport/
lib/ active_support/ core_ext/ object/ blank.rb activesupport/
lib/ active_support/ core_ext/ object/ deep_dup.rb activesupport/
lib/ active_support/ core_ext/ object/ duplicable.rb activesupport/
lib/ active_support/ core_ext/ object/ inclusion.rb activesupport/
lib/ active_support/ core_ext/ object/ instance_variables.rb
6 More Less
activesupport/
lib/ active_support/ core_ext/ object/ json.rb activesupport/
lib/ active_support/ core_ext/ object/ with.rb activesupport/
lib/ active_support/ core_ext/ object/ with_options.rb activesupport/
lib/ active_support/ core_ext/ string/ output_safety.rb activesupport/
lib/ active_support/ hash_with_indifferent_access.rb activesupport/
lib/ active_support/ xml_mini/ jdom.rb