Artigos com a tag ‘ActiveSupport’

Edge Rails: delegate :allow_nil

22 de janeiro de 2009  |  Rails 2.3  |  1 Comentário  | 

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.

Edge Rails: Array#to_sentence

7 de janeiro de 2009  |  Rails 2.3  |  2 Comentários  | 

Atualmente o método Array#to_sentence possui as opções :connector que permite configurar a palavra usada para ligar os dois últimos elementos da lista, normalmente a palavra “and” ou a letra “e” em português e :skip_last_comma que como diz o nome remove a última virgula da frase.

À partir do Rails 2.3 este método não terá mais as opções acima, que serão substituídas pelas seguintes:

:words_connector
O símbolo ou palavra que será usado para ligar os elementos na frase, somente quando o Array tem mais de dois elementos. O valor padrão é “, “.

:two_words_connector
Esta opção funciona como a de cima, mas somente quando o Array possuir apenas dois elementos. O valor padrão é ” and “.

:last_word_connector
Esta opção define o símbolo ou palavra que ligará os dois últimos elementos do Array na frase. O valor padrão é “, and “.

A opção :locale que já existe hoje continuará existindo normalmente. Um exemplo de uso do novo método para conseguir uma frase em português seria:

>> ['Cachorro', 'Gato', 'Camelo'].to_sentence :last_word_connector => " e "
=> "Cachorro, Gato e Camelo"

Você também deve configurar o seu arquivo de internacionalização para o novo formato:

pt-BR:
  support:
    array:
      words_connector: ", "
      two_words_connector: " e "
      last_word_connector: " e "

Esta decisão foi tomada para facilitar o processo de internacionalização do Rails em algumas línguas.


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.

Edge Rails: Object#try

25 de dezembro de 2008  |  Rails 2.3  |  5 Comentários  | 

Eu já falei do método try() antes. Na época era apenas uma dica dada por Chris Wanstrath (que ainda nem era famoso pelo GitHub) para simplificar o bom e velho trecho de código:

@person ? @person.name : nil

Que com este método ficaria assim:

@person.try(:name)

# Um outro exemplo, com parâmetros
Person.try(:find, 1)

Ele funciona como o Object#send, mas ao invés de disparar uma exceção ele retorna nil se o método ou o próprio objeto não existirem.

Chris Wanstrath teve esta idéia já faz um bom tempo, e não me pergunte porque só agora isto entrou oficialmente para o Rails. Como já se passou muito tempo, o método já foi aprimorado aceitando também blocos como parâmetros:

@people.try(:map) {|p| p.name}

Isto é útil caso o método que você esteja testando chamar precise receber um bloco.


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.

Edge Rails: Backtrace Cleaner

23 de dezembro de 2008  |  Rails 2.3  |  Nenhum comentário  | 

Já ouviu falar do plugin Quiet Backtrace criado pela Thoughtbot, a mesma galera por trás do Paperclip e Shoulda? Este plugin é muito interessante porque ele permite que você remova certas linhas do backtrace do Rails, tornando o log muito menor e simplificando a localização de problemas.

O conceito por trás deste plugin foi adicionado ao Rails. Um novo initializer chamado backtrace_silencers.rb foi criado e virá com algumas linhas de exemplo comentadas, assim:

# Be sure to restart your server when you modify this file.

# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }

# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
# Rails.backtrace_cleaner.remove_silencers!

Neste arquivo você pode incluir silenciadores e filtros para o backtrace. Por exemplo o seguinte silenciador removerá do backtrace qualquer linha que contenha a palavra mongrel:

Rails.backtrace_cleaner.add_silencer { |line| line =~ /mongrel/ }

Os filtros funcionam de uma maneira um pouco diferente, não removendo a linha, mas substituindo trechos do backtrace por alguma outra coisa. No exemplo abaixo estou fazendo com que toda vez que a palavra mongrel aparecer no backtrace ela seja substituída por ‘aeiou’:

Rails.backtrace_cleaner.add_filter { |line| line.gsub("mongrel", 'aeiou') }

Para desligar esta funcionalidade temporariamente basta tirar o comentário da linha abaixo:

Rails.backtrace_cleaner.remove_silencers!

Usado com sabedoria, este novo recurso pode se tornar uma ferramenta poderosa.


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.

Edge Rails: Enumerable#none?

19 de dezembro de 2008  |  Rails 2.3  |  Nenhum comentário  | 

Foi adicionado à classe Enumerable um novo método chamado none?. Este método nos auxiliará nos momentos em que se faz necessário verificar se nenhum dos itens de uma coleção correspondem a uma determinada regra.

Por exemplo, no código abaixo a variável success somente será true se o status de todos os elementos da coleção responses não representarem um redirecionamento:

success = responses.none? {|r| r.status / 100 == 3 }

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.

Rails 2.2: Adicionando um prefixo aos delegates

15 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

O método Module#delegate agora possui uma nova opção :prefix que pode ser atribuída caso você queira que o nome da classe alvo seja usado como prefixo antes do nome do método. Vejamos dois exemplos, primeiro da forma comum:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client
end

Invoice.new.street
Invoice.new.city
Invoice.new.name

Agora usando a opção :prefix:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client, :prefix => true
end

Invoice.new.client_street
Invoice.new.client_city
Invoice.new.client_name

Você também pode personalizar, atribuindo um outro nome ao prefixo:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client, :prefix => :customer
end

Invoice.new.customer_street
Invoice.new.customer_city
Invoice.new.customer_name

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Time#advance reconhece frações de dias e semanas

10 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Após o lançamento do Rails 2.1 o método Time#advance parou de funcionar corretamente com frações de tempo como:

>> Time.stubs(:now).returns Time.local(2000)

>> 1.5.days.ago == 36.hours.ago
# => false

Este erro foi corrigido no Rails 2.2.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Alterada a mensagem do método assert_difference

20 de novembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Quando usávamos o método assert_difference com múltiplas expressões e um erro ocorria era difícil de saber qual das expressões não teve seu valor alterado, já que a mensagem de erro não informava isto.

No Rails 2.2 a mensagem devolvida pelo método informará exatamente qual expressão não passou no teste. Por exemplo:

assert_difference ['Post.count', 'current_user.posts.count'] do
  Post.create(params)
end

O código acima retornará a seguinte mensagem, caso a segunda expressão não tenha passado:

<current_user.posts.count> was expression that failed. <1> expected but was <0>.

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Três novos métodos para classes que trabalham com datas e horas

31 de outubro de 2008  |  Rails 2.2  |  1 Comentário  | 

As classes Time, Date, DateTime e TimeWithZone receberam três novos métodos muito convenientes. Os métodos today?, past? e future? foram introduzidos em todas as classes que trabalham com datas e horas para facilitar nossa vida em algumas situações.

Acredito que não seja necessário explicar o funcionamento de cada um. Então vejamos os métodos em ação:

date = Date.current
# => Sat, 04 Oct 2008

date.today?
# => true

date.past?
# => false

date.future?
# => false

time = Time.now
# => Sat Oct 04 18:36:43 -0300 2008

time.today?
# => true

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades no e-book “Ruby on Rails 2.2 – O que há de novo?“.

Rails 2.2: Inflector#parameterize simplifica a criação de URLs elegantes

26 de outubro de 2008  |  Rails 2.2  |  1 Comentário  | 

Um novo inflector foi incluído no Rails, e particularmente acho este é muito útil. O parameterize transforma um texto qualquer em um formato ideal para o uso em URLs. Por exemplo:

class User
  def to_param
    "#{id}-#{name.parameterize}"
  end
end

@user = User.find(1)
# => #<User id: 1, name: "Carlos E. Brando">

link_to @user.name, user_path
# => <a href="/users/1-carlos-e-brando">Carlos E. Brando</a>

Um fato interessante é que logo de inicio a implementação feita não aceitava o uso de caracteres acentuados, o que significava um problema para muita gente ao redor do mundo, inclusive nós brasileiros. Um dia depois da primeira implementação, Michael Koziarski salvou nossas vidas incluindo este suporte. Mesmo assim o código ainda não estava perfeito, então decidiu-se adaptar o código do ótimo plugin slugalizer criado por Henrik Nyh. Agora sim, ficou perfeito!

Para aqueles que ainda não estão fazendo uso do Rails 2.2, o plugin slugalizer resolve o problema.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.