Carlos Brando

Nome do Jogo

Edge Rails: delegate :allow_nil

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:

class Greeter < ActiveRecord::Base
  def hello
    "hello"
  end
end

class Foo < ActiveRecord::Base
  belongs_to :greeter
  delegate :hello, :to => :greeter
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.

class Foo
  attr_accessor :bar
  def initialize(bar = nil)
    @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.

Comments