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

New Rails 2.2 i18n defaults

19 de novembro de 2008  |  Rails 2.2  |  1 Comentário  | 

Normalmente no Rails funciona assim: Programadores do mundo todo desenvolvem novas funcionalidades e corrigem bugs, criam patchs e o core team aceita ou não estes patches. Mas quando DHH resolve colocar a mão no código ele muda tudo. O bom é que na maioria das vezes é para melhor!

No último Rails Podcast Brasil eu disse que deveríamos ficar atentos a algumas mudanças dele na parte de internacionalização. Ele mudou mais do que isto internamente, mas uma alteração importante foi a criação de um diretório config/locales para colocarmos nossos arquivos de internacionalização.

Também foi adicionado ao arquivo environment.rb o seguinte comentário:

# The internationalization framework can be changed
# to have another default locale (standard is :en) or more load paths.
# All files from config/locales/*.rb,yml are added automatically.
# config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
# config.i18n.default_locale = :de

O que já era fácil, ficou mais fácil! Na teoria é só colocar o seu arquivo br.yml ou br.rb nesta pasta e alterar a última linha comentada e pronto!

Rails 2.2: Opções no método field_set_tag

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

Foi adicionado ao método field_set_tag um parâmetro opcional para facilitar a formatação do HTML. Este parâmetro aceita todas as opções que o método tag já aceita. Exemplo:

<% field_set_tag nil, :class => 'format' do %>
  <p>Some text</p>
<% end %>

O código acima retornará o seguinte:

<fieldset class="format">
  <p>Some text</p>
</fieldset>

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 Podcast Brasil – Episódio 38: Especial Rails 2.2

18 de novembro de 2008  |  Podcasts, Rails 2.2  |  1 Comentário  | 

Um episódio inteiro comentando as principais alterações no Rails 2.2, explicando alguns conceitos e tirando algumas dúvidas.

Entenda se você poderá se beneficiar do novo sistema de Thread-Safe do Rails, o que são eTags, quais métodos saíram e quais entraram e muito mais.

Obviamente não deu para cobrir todas as alterações, principalmente porque não dá para explicar muito sobre código em um podcast. Mas se você deseja entender melhor cada uma das novidades desta versão há três formas: Leia a tradução do Akita do release notes, acompanhe a séria Edge Rails deste blog, ou compre o PDF (em português e inglês) + screencast do Rails 2.2 no site do Envycasts.

Download: Episódio #38
iTunes: http://podcast.rubyonrails.pro.br/rss
Episódios anteriores: http://podcast.rubyonrails.pro.br/

Nota: Este episódio foi gravado na semana passada, antes do anúncio do Rails 2.2 RC2.

Rails 2.2 RC2

14 de novembro de 2008  |  Notícias, Rails 2.2  |  Nenhum comentário  | 

Conforme previ no último podcast, saiu o segundo release candidate do Rails 2.2. Esta versão ficou classificada como 2.2.1 e deve ser a última antes do lançamento oficial do Rails 2.2, que deve aparecer como 2.2.3.

Foi criado um novo branch para esta versão no GitHub, o que significa um congelamento do que temos até agora, nenhuma outra novidade será incluída de agora em diante para esta versão. Também podemos definir que a partir de agora tudo de novo quer for acrescentado ao Rails será para uma futura versão 2.3 ou 3.0.

Para os que já desejam ir testando esta nova versão, primeiro devem atualizar o RubyGems para a versão 1.3.1:

gem update --system

Só então instalar o novo gem:

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

Enjoy!

Rails 2.2: Tornando atributos do ActiveRecord privados

14 de novembro de 2008  |  Rails 2.2  |  1 Comentário  | 

No Rails 2.2 você poderá definir atributos do ActiveRecord como private. Como estes atributos são criados via metaprogramação, até agora isto era impossível.

Para entender como isto funcionará, vamos tornar o atributo name da classe User privado:

class User < ActiveRecord::Base

  private
  def name
    "I'm private"
  end

end

Agora ao tentar recuperar o valor do atributo name:

user = User.first
# => #<User id: 1, name: "teste", created_at: "2008-09-26 21:55:23", updated_at: "2008-09-26 21:55:23">

user.name
# => NoMethodError: undefined method `NoMethodError' for #<User:0x234df08>
#    from /Users/carlosbrando/Projects/sandbox/edge/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:260:in `method_missing'
#    from /Users/carlosbrando/Projects/sandbox/edge/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:236:in `method_missing'
#    from (irb):3

Veja que uma exceção NoMethodError foi disparada ao executar o método que agora é privado. Por outro lado eu posso alterar o nome do usuário, já que o método name= ainda é público.

user.name = "Carlos"
# => "Carlos"

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: Novo método de instância Model#delete

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

Para tornar o ActiveRecord mais consistente foi adicionado o método de instância Model#delete. Ele é similar ao método de classe com o mesmo nome. O método delete, diferente do método destroy, apaga o registro do banco de dados sem disparar callbacks, como o before_destroy e o after_destroy.

Este método também não aplicará nenhuma das regras impostas na associação através de cláusulas como :dependent.

client = Client.find(1)
client.delete

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: Caminho completo da view no caso de uma exceção

5 de novembro de 2008  |  Rails 2.2  |  1 Comentário  | 

Quando uma exceção é dispara recebemos em nossa view uma mensagem semelhante a esta:

NoMethodError in Administration/groups#show
Showing app/views//_list.erb where line ...

Quando na verdade deveríamos receber uma mensagem com o caminho completo do arquivo que disparou o erro, assim:

NoMethodError in Administration/groups#show
Showing app/views/administration/reports/_list.erb where line ...

Este problema já está corrigido no Rails 2.2, facilitando nosso trabalho.


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: Cookie de sessão agora é HttpOnly

4 de novembro de 2008  |  Rails 2.2  |  1 Comentário  | 

Ao se criar um cookie existe uma opção esquecida por muita gente. A opção http_only faz com que o cookie somente seja acessível via HTTP, impedindo que um trecho de código em javascript consiga acessá-lo. O valor padrão para esta opção é false.

No Rails 2.2 o cookie que armazena a sessão do usuário terá a opção http_only ligada por padrão. A intenção é aumentar a segurança em nossos projetos. Obviamente esta opção pode ser desligada caso necessário. Se este for o caso, basta incluir a seguinte linha no ApplicationController ou em um controller especifico:

session :session_http_only => false

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: Tarefa db:migrate:redo agora aceita a versão da migration

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

A tarefa rake db:migrate:redo tem se mostrado muito útil quando precisamos voltar e executar novamente a última migration criada. Agora esta tarefa ficou ainda mais útil, porque podemos utilizar a opção VERSION e informar qual migration queremos que seja reexecutada.

rake db:migrate:redo VERSION=20080725004631

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