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?“.
Para entender esta alteração, vamos precisar analisar o mesmo código sendo executado em uma versão anterior do Rails e depois no Rails 2.2. Vamos pegar um modelo como exemplo:
end
Note que estou usando o método alias_attribute para criar um alias para o atributo body com o nome de text. Na teoria este método deveria replicar todos os métodos de leitura, escrita, pesquisa e qualquer outro que envolva o atributo body. Mas vejamos um exemplo sendo executado no Rails 2.1 ou anterior:
c = Comment.first
# => #<Comment id: 1, body: "my comment">
c.body
# => "my comment"
c.text
# => "my comment"
c.body = "a new message"
# => "a new message"
c.body_changed?
# => true
c.text_changed?
# => NoMethodError: undefined method `text_changed?' ...
Ao executar o método text_changed? temos um erro, porque o alias_attribute não estava replicando os métodos de rastreamento, mas isto já foi corrigido. Veja o mesmo código executado agora em um projeto Rails 2.2:
c = Comment.first
# => #<Comment id: 1, body: "my comment">
c.body
# => "my comment"
c.text
# => "my comment"
c.body = "a new message"
# => "a new message"
c.body_changed?
# => true
c.text_changed?
# => true
c.text_change
# => ["my comment", "a new message"]
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?“.
Não sei dizer se isto é um bug ou não, mas na minha opinião isto representa um problema. Veja o código abaixo, onde tento alterar a conta de um usuário usando sua foreign key em um projeto Rails 2.1 ou anterior:
end
user = User.first
# => #<User id: 1, login: "admin", account_id: 1>
user.account
# => #<Account id: 1, name: "My Account">
user.account_id = 2
# => 2
user.account
# => #<Account id: 1, name: "My Account">
Note que estou alterando a conta do usuário, mas a associação não foi atualizada. Mesmo depois de salvar o objeto user, se ele não for recarregado, a associação continuará mostrando a conta errada.
No Rails 2.2 este problema foi corrigido, veja:
end
comment = Comment.first
# => #<Comment id: 1>
>> comment.post
# => #<Post id: 1>
>> comment.post_id = 2
# => 2
>> comment.post
# => #<Post id: 2>
Veja que ao alterar o post por meio de sua foreign key, automaticamente a associação foi atualizada.
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?“.
Da mesma forma como temos o script/server --debugger, agora também temos o script/console --debugger. Esta opção basicamente carrega a biblioteca ruby-debug ao iniciar o console.
É mais fácil usar esta opção do que executar um require 'ruby-debug' no console toda vez que precisar deste recurso.
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?“.
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?“.
O método composed_of recebeu duas novas opções: :constructor e :converter.
A opção :constructor pode receber um simbolo com o nome de um método ou um Proc. Por padrão, a classe de composição é criada através do método new, recebendo todos os atributos mapeadas como parâmetros, exatamente na ordem que em foram mapeados. Se por algum motivo a sua classe não aceitar esta convenção, você deve fazer uso da opção :constructor. Com ela você pode alterar a forma como sua classe deve ser criada. Veja um exemplo retirado da própria documentação do Rails:
composed_of :ip_address,
:class_name => 'IPAddr',
:mapping => %w(ip to_i),
:constructor => Proc.new {|ip| IPAddr.new(ip, Socket::AF_INET) }
No exemplo, como você pode ver, ao criar uma nova instancia da classe IPAddr é necessário informar mais um parâmetro ao construtor. Fazendo uso da opção :constructor isto se torna bem simples.
Quanto a opção :converter, ela também aceita um simbolo que represente um método da classe informada na opção :class_name ou um Proc, e é disparado quando um valor diferente de uma instância da classe informada for passado para a propriedade criada, o que torna necessário uma conversão. Mais um exemplo:
composed_of :balance,
:class_name => "Money",
:mapping => %w(balance amount),
:converter => Proc.new {|balance| Money.parse(balance) }
No exemplo acima o método balance= sempre estará esperando por uma instancia da classe Money, mas caso um outro tipo de objeto seja informado ele deverá ser convertido usando o método parse do objeto Money.
Com esta nova opção não devemos mais usar o bloco de conversão que o método permitia antes, a conversão sempre deve ser feita através do uso da opção :converter.
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?“.
Já faz alguns dias que estou batalhando para publicar mais um livro sobre o Ruby on Rails 2.2, assim como fiz no começo deste ano com a versão 2.1. Vocês não imaginam o trabalho que dá analisar cada commit realizado no Rails, testar as novas implementações e documentar isto.
Tentei de todas as maneiras conseguir um patrocinador, alguma empresa interessada em promover o livro, que pudesse me financiar para escreve-lo, já que este é um trabalho que consome muitos dias. O máximo que consegui foram algumas empresas oferecendo uma miséria em troca de propaganda.
Foi quando Gregg Pollack me procurou e sugeriu juntarmos este livro e o seu novo screencast do Rails 2.2 e vendermos em um pacote promocional. Não preciso dizer que aceitei!

Neste momento já está disponível para compra o meu livro “Ruby on Rails 2.2 – O que há de novo?” em português e inglês (traduzido por Carl Youngblood) por 9 dólares no site do Envycasts. Você também pode comprar o pacote promocional que vem com as duas versões do livro e mais um screencast gravado pelos engraçadissimos Gregg Pollack e Jason Seifer, por apenas 16 dólares.
O livro (120 páginas) cobre todas as principais novidades do Rails 2.2 e está recheado de exemplos para que você possa testá-las. Se você costuma acompanhar a série Edge Rails deste blog, com certeza vai gostar do conteúdo do livro, que contém muito mais do que já foi publicado por aqui.
David Heinemeier Hansson anunciou no blog oficial do Ruby on Rails o lançamento do primeiro Release Candidate do Rails 2.2.
Para saber de todas as novidades você pode acessar a série Edge Rails, publicada neste blog.
Para instalar a versão 2.2 RC1 execute no terminal:
Além da correção do bug no método count do ActiveRecord, conforme mencionei no post anterior. Outra correção de segurança vem com com a nova versão 2.1.2 do Rails.
Até agora no Rails as URLs passadas para o método redirect_to não passavam por um processo de santization. Isto era perigoso, pois abria brechas para que pessoas mal intencionadas pudessem realizar ataques do tipo response splitting e header injection em sua aplicação.
Um exemplo desta vulnerabilidade é quando seu aplicativo recebe uma URL via query string e redireciona seu usuário através do método redirect_to para esta URL. Através desta brecha de segurança pessoas mal intencionadas podem gravar cookies na máquina e forjar falsos responses para seus usuários se o seu projeto usar estes parâmetros para construir cabeçalhos HTTP.
Para evitar este tipo de problema o Rails foi atualizado para limpar (sanitize) todas as URLs passadas para o método redirect_to. Mas isto não significa que não precisamos nos preocupar mais com este problema, é sempre bom ficar atento.
A opção :confirm, muito utilizada em helpers como o link_to, agora também está disponível para o método image_submit_tag.
Esta opção faz com que uma caixa de confirmação, com uma pergunta personalizada, seja exibida ao se clicar na imagem. Se o usuário aceitar, o formulário é enviado normalmente, caso contrário nada acontece.
image_submit_tag("delete.gif", :confirm => "Are you sure?")
# => <input type="image" src="/images/delete.gif" onclick="return confirm('Are you sure?');"/>
Este artigo pertence a série “Edge Rails”. Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. A intenção desta série é preparar antecipadamente os programadores para as próximas versões do framework.
