O método delegate é util para expor métodos de terceiros em uma classe como se fossem dela. Para aqueles que não conhecem este método, vamos pegar um exemplo:
end
end
Foo.new.hello # => "hello"
Como você pode ver no exemplo acima estou executando o método hello como se ele pertencesse a classe Foo, embora ele realmente pertença a classe Greeter.
Mas o que aconteceria se a associação não existisse e o objeto greeter fosse nulo? Teríamos um erro do tipo NoMethodError ao executar o método hello já que por debaixo dos panos estaríamos executando nil.hello.
Para contornar este tipo de problema foi adicionado ao método delegate a opção :allow_nil que impede o retorno de uma exceção nesses casos.
attr_accessor :bar
@bar = bar
end
delegate :zoo, :to => :bar, :allow_nil => true
end
Foo.new.zoo # returns nil
No exemplo acima mesmo que o objeto bar seja nulo, o método zoo não disparará uma exceção, ele retornará nil.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
O Delegate é interessante. Porém, acho que precisa de muita repetição de código. Eu criei uma gem demeter que faz o trabalho de forma bem mais simples sem perder essa flexibilidade, com a vantagem de rodar também em Ruby sem Rails.
http://codificando.com/2009/11/26/law-of-demeter-simples-em-ruby-com-a-gem-demeter/