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.
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:
Você também deve configurar o seu arquivo de internacionalização para o novo formato:
", "
" e "
" 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.
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.
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.
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.
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:
end
Invoice.new.street
Invoice.new.city
Invoice.new.name
Agora usando a opção :prefix:
end
Invoice.new.client_street
Invoice.new.client_city
Invoice.new.client_name
Você também pode personalizar, atribuindo um outro nome ao prefixo:
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?“.
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?“.
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?“.
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?“.
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:
"-"
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?“.