Method: Object#with

Defined in:
activesupport/lib/active_support/core_ext/object/with.rb

#with(**attributes) ⇒ Object

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.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 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