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 |