`

# What is delegation?

208

In Ruby, the `delegate` method is used to delegate method calls to an associated object, often referred to as a delegate or proxy. This helps to simplify the code and reduce redundancy by allowing an object to pass method calls to another object.

The `delegate` method is part of the `Forwardable` module and the `Delegator` class in Ruby's standard library. Here's how you can use `delegate` in different contexts:

Using the `Forwardable` Module

The `Forwardable` module provides methods to delegate specified method calls to designated objects.

require 'forwardable'

class User
  extend Forwardable

  attr_accessor :profile

  def_delegators :@profile, :name, :age

  def initialize(profile)
    @profile = profile
  end
end

class Profile
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end
end

profile = Profile.new("Alice", 30)
user = User.new(profile)

puts user.name  # Outputs: Alice
puts user.age   # Outputs: 30


In this example, the `User` class delegates the `name` and `age` methods to its `profile` object.

Using the `SimpleDelegator` Class

The `SimpleDelegator` class allows an object to delegate all of its methods to another object.

require 'delegate'

class User < SimpleDelegator
  def initialize(profile)
    super(profile)
  end
end

class Profile
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end
end

profile = Profile.new("Alice", 30)
user = User.new(profile)

puts user.name  # Outputs: Alice
puts user.age   # Outputs: 30


In this example, the `User` class is a subclass of `SimpleDelegator` and delegates all method calls to its `profile` object.

Using the Active Support `delegate` Method

If you are using Rails, Active Support provides a convenient `delegate` method that can be used within a class to delegate method calls to an associated object.

class User
  attr_accessor :profile

  def initialize(profile)
    @profile = profile
  end

  delegate :name, :age, to: :profile
end

class Profile
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end
end

profile = Profile.new("Alice", 30)
user = User.new(profile)

puts user.name  # Outputs: Alice
puts user.age   # Outputs: 30

In this example, the `User` class uses the `delegate` method provided by Active Support to delegate the `name` and `age` methods to its `profile` object.

By using delegation, you can design more modular and maintainable code, as it allows you to split responsibilities among different objects without unnecessary repetition.