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: alias_attribute funcionando com Dirty Objects

30 de outubro de 2008  |  Rails 2.2  |  10 Comentários  | 

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:

class Comment < ActiveRecord::Base
  alias_attribute :text, :body
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?“.

Rails 2.2: Atualizando uma associação através de sua foreign key

29 de outubro de 2008  |  Rails 2.2  |  7 Comentários  | 

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:

class User < ActiveRecord::Base
  belongs_to :account
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:

class Comment < ActiveRecord::Base
  belongs_to :post
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?“.

Rails 2.2: Debug no console do Rails

27 de outubro de 2008  |  Rails 2.2  |  2 Comentários  | 

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?“.

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?“.

Rails 2.2: Novas opções para o método composed_of

26 de outubro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

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?“.

Novo livro e screencast: Ruby on Rails 2.2 – O que há de novo?

24 de outubro de 2008  |  Destaques, Meus Livros, Rails 2.2, Vídeos  |  38 Comentários  | 

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.

Rails 2.2 Release Candidate 1 Released

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

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:

gem install rails -s http://gems.rubyonrails.org -v 2.2.0

Evitando ataques Response Splitting

23 de outubro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

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.

Edge Rails: Opção :confirm no método image_submit_tag

23 de outubro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

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.