Anotações de Lançamento Ruby on Rails 3.0 (Beta)

2010 February 05, 09:10 h

Upgrade 05/02: o Rails 3 Beta está oficialmente lançado! Leia o post do DHH e a restrospectiva do Yehuda. Agora já dá para instalar via gems:

1
2
3
gem uninstall bundler # => precisa desinstalar os bundlers abaixo da versão 0.9.2
gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n
gem install rails --pre

Upgrade 04/02: o David atualizou as anotações. Acabei de retraduzir o principal.

O Rails 3.0 é pôneis e arco-iris! Ele vai te cozinhar o jantar e lavar sua roupa. Você vai se perguntar como era possível viver antes dele chegar. É a Melhor Versão do Rails Já Feito!

Mas falando sério, é realmente coisa boa. Estão todas as boas idéias trazidas quando a equipe do Merb se juntou à festa e trouxe um foco de agnosticismo de frameworks, partes internas mais leves e rápidas, e várias ótimas APIs. Se você está vindo para o Rails 3.0 a partir do Merb 1.x, vai reconhecer muito disso. Se você está vindo do Rails 2.x, vai adorar também.

Mesmo que você não dê a mínima para nada disso das limpezas internas, Rails 3.0 vai agradar. Temos várias novas funcionalidades e APIs melhoradas. Nunca houve um momento melhor para ser um desenvolvedor Rails. Algumas das coisas principais são:

Em cima disso tudo tentamos nosso melhor para deprecar as APIs antigas com avisos. Isso significa que você pode mover sua aplicação existente para Rails 3 sem imediatamente reescrever todo seu código antigo para as últimas boas práticas.

Estas anotações de lançamento cobre todas as principais atualizações, mas não incluem cada uma das pequenas correções de bug e mudanças. Rails 3.0 consiste de quase 4 mil commits por mais de 250 autores! Se quiser ver tudo, veja a Lista de Commits no repositório principal do Rails no Github.

AVISO: O Rails 3.0 está atualmente em beta. Isso significa que provavelmente existem bugs e que você deve reportá-los se encontrá-los. Você provavelmente não vai querer rodar a aplicação de lançamento nuclear NORAD de uma versão beta. Mas se está iniciando o desenvolvimento de uma nova aplicação e não se incomoda com um pouco de vento na cabeça, por favor embarque!

Atualizando para Rails 3

Como sempre, tendo uma ampla cobertura, passar por uma suite de testes é a melhor forma de atualizar. Você também deve primeiro fazer a atualização para Rails 2.3.5 e garantir que sua aplicação ainda roda antes de tentar atualizar para o Rails 3.0. No geral, a atualização do Rails 2.x para 3.0 centraliza ao redor de 3 grandes mudanças:

Rails 3 requer Ruby 1.8.7+

Rails só roda na versão 1.8.7 ou mais recente do Ruby. Suporte a versões anteriores do Ruby foi oficialmente cortada e você deve atualizar o mais cedo possível. Rails 3.0 também é compatível com Ruby 1.9.2.

Objeto de Aplicação Rails

Como parte do trabalho de suportar a execução de múltiplas aplicações Rails no mesmo processo, o Rails 3 introduz o conceito de um objeto de Aplicação. Ela segura todas as configurações específicas da aplicação e é muito similar en natureza com o config/environment.rb de versões anteriores do Rails.

Cada aplicação Rails agora deve ter um objeto de aplicação correspondente. Ele é definido em config/application.rb. Se estiver atualizando uma aplicação existente para Rails 3, você deve adicionar esse arquivo e mover as configurações apropriadas do config/environment.rb para o config/application.rb.

script/* substituído por script/rails

O novo script/rails substitui todos os scripts que costumavam ficar no diretório script. Mas você não executa script/rails diretamente, o comando rails detecta que ele está sendo invocado a partir da raíz de uma aplicação Rails e roda o script para você. O uso intencionado é:

1
2
rails console                      # => ./script/console
rails g scaffold post title:string # => ./script/generate scaffold post title:string

Rode rails —help para listar todas as opções

Dependências e config.gem

O método config.gem foi retirado e substituído pelo uso do bundler e um arquivo Gemfile, veja Vendorizando Gems abaixo.

Processo de Atualização

Para ajudar no processo de atualização, um plugin chamado de Rails Upgrade foi criado para automatizar algumas partes.

Simplesmente instale o plugin, então rode rake rails:upgrade:check para checar sua aplicação por locais que precisam ser atualizadas (com links para informações sobre como atualizá-las). Ele também oferece uma tarefa para gerar o Gemfile baseado nas suas chamadas atuais a config.gem e uma tarefa para gerar um novo arquivo de rotas a partir do seu atual. Para pegar o plugin, simplesmente rode o seguinte:

1
rails plugin install git://github.com/rails/rails_upgrade.git

Você pode ver um exemplo de como isso funciona em Rails Upgrade agora é um Plugin Oficial

Além da ferramenta de atualização, se precisar de mais ajuda, existem pessoas no canal de IRC rubyonrails-talk que estão provavelmente fazendo a mesma coisa, possivelmente pegando os mesmos problemas. Blogue suas experiências ao atualizar para que outros possam se beneficiar de seus conhecimentos!

Mais informações – O Caminho para o Rails 3: Atualizando

Criando uma aplicação Rails 3.0

A nova sequência de instalação do rails (para o beta) é:

1
2
3
$ gem install rails --prerelease
$ rails myapp
$ cd myapp

Vendorizando Gems

Rails agora usa um arquivo Gemfile na raíz da aplicação para determinar as gems requeridas para sua aplicação iniciar. Esse Gemfile é então lido e executado pela nova gem Bundler que então vendoriza todas as suas gems no diretório vendor, tornando sua aplicação Rails isolada das gems do sistema.

Mais informações: – Usando bundler

Morando no Edge

Bundler e Gemfile torna muito fácil congelar sua aplicação Rails com o novo comando dedicado bundle, então rake freeze não é mais relevante e foi retirado.

Se quiser criar um bundle diretamente do repositório Git, você pode passar o flag de edge:

1
$ rails myapp --edge

Mais informações:

Mudanças Arquiteturais no Rails

Existem seis grandes mudanças arquiteturais no Rails.

Railties Refeito

O Railties foi atualizado para fornecer uma API de plugin consistente para todo o framework Rails assim como uma total reescrita dos geradores e ligamentos Rails, o resultado é que desenvolvedores agora podem se ligar a qualquer estágio significativo dos geradores e framework de aplicação de uma forma consistente e definida.

Todos os componentes núcleo do Rails estão desacoplados

Com a mesclagem do Merb e Rails, um dos grandes trabalhos foi remover os acoplamentos entre os componentes núcleo do Rails. Isso foi atingido, e todos os componentes núcleo do Rails agora usam as mesmas APIs que você pode usar para desenvolver plugins. Isso significa que qualquer plugin que fizer, ou qualquer substituição de um componente núcleo (como DataMapper ou Sequel) podem acessar todas as funcionalidades que os componentes núcleo do Rails tem acesso, estender e melhorá-los.

Mais informações: – O Grande Desacoplamento

Abstração Active Model

Parte do desacoplamento dos componentes núcleo foi extrair todos os relacionamentos ao Active Record do Action Pack. Isso foi completado. Todos os novos plugins de ORM agora só precisam implementar as interfaces do Active Model para funcionar sem problemas com o Action Pack.

Mais informações: – Faça Qualquer Objeto Ruby se Sentir como Active Record

Abstração de Controller

Outra grande parte do desacoplamento dos componentes núcleo foi criar uma superclasse de base que é separada das noções de HTTP com o objetivo de ser capaz de renderizar views, etc. Essa criação do AbstractController permitiu o ActionController e ActionMailer se serem simplificados com código comum removido de todas essas bibliotecas e colocadas no Abstract Controller.

Mais informações: – Arquitetura do Rails Edge

Integração com Arel

Arel (ou Active Relation) foi usado como fundação do Active Record e agora é requerido pelo Rails (ele é instalado quando você faz gem bundle). Arel fornece uma abstração de SQL que simplifica o Active Record e fornece as fundações para a funcionalidade de relacionamentos no Active Record.

Mais informações: – Por que escrevi Arel.

Extração de Mail

O Action Mailer, desde o começo, era composto de monkey patches, pré-parsers e mesmo agentes de entrega e recebimento, tudo isso além de ter o TMail vendorizado na sua árvore de código. A versão 3 muda isso com todas as funcionalidades relacionadas e email abstraídas para a gem Mail. Novamente isso reduz duplicação de código e ajuda a criar limites definidos entre o Action Mailer e o parser de email.

Mais informações: – Nova API de Action Mailer no Rails 3

Documentação

A documentação na árvore do Rails está sendo atualizada com todas as mudanças de API, em adição, o Rails Edge guides está sendo atualizado para refletir as mudanças no Rails 3.0. Entretanto os guias em guides.rubyonrails.org continuarão a conter somente a versão estável do Rails (neste ponto, a versão 2.3.5, até o lançamento da 3.0).

Mais informações: – Projetos de Documentação do Rails.

Internacionalização

Uma grande quantidade de trabalho foi feito com o suporte a I18n no Rails 3, incluindo a gem mais recente I18n dando muitas melhorias.

Mais Informações: – Mudanças I18n no Rails 3

Railties

Com o desacoplamento dos principais frameworks do Rails, o Railties recebeu uma grande revisão de forma a ligar frameworks, engines e plugins algo o menos doloroso e extensível quanto possível:

A geração de Aplicação recebeu flags extras, permitindo que você pule a instalação de test-unit, Active Record, Prototype e Git. Também um novo flag —dev foi adicionado, o que faz o Gemfile apontar para sua cópia do Rails (que é determinada pelo caminho do binário rails). Veja rails —help para mais informações.

Geradores do Railties receberam uma enorme atenção no Rails 3.0, basicamente:

As views geradas pelos geradores do Railties também receberam grande revisão:

Finalmente algumas melhorias que adicionamos a tarefas de rake:

Railties deprecou:

PLUGIN/rails/tasks, e PLUGIN/tasks não são mais carregados e todas as tarefas devem ficar em PLUGIN/lib/tasks.

Mais informações:

Action Pack

Aconteceram mudanças internas e externas significativas no Action Pack.

Abstract Controller

O Abstract Controller coloca as partes genéricas do Action Controller em um módulo reusável que qualquer biblioteca pode usar para renderizar templates, partials, helpers, traduções, log, qualquer parte do ciclo de requisição e resposta. Essa abstração permitiu ao ActionMailer::Base somente herdar a partir de AbstractController e adicionar uma DSL Rails para a gem Mail.

Também deu uma oportunidade de limpar o Action Controller, abstraindo o que fosse possível para simplificar o código.

Note, entretanto, que o Abstract Controller não é uma API para usuários, você não deve esbarrar nele no seu uso do dia-a-dia com Rails.

Mais informações: – Arquitetura do Rails Edge

Action Controller

Deprecado:

Mais informações:

Action Dispatch

Action Dispatch é novo no Rails 3.0 e fornece uma nova, mais limpa implementação para roteamento.

1
2
3
4
5
6
7
8
9
10
11
# Em vez de:

ActionController::Routing::Routes.draw do
  map.resources :posts
end

# Você faz:

AppName::Application.routes do
  resources :posts
end
1
2
3
4
5
scope 'pt' do
  resources :projects, :path_names => { :edit => 'modificar' }, :as => 'projeto' }
end

# Lhe dá a ação de editar como /pt/projeto/1/modificar

NOTA. O estilo antigo de comandos map ainda funcionam como antes com a camada de compatibilidade, entretando isso será removido no lançamento da versão 3.1.

Deprecado

Mais informações:

Action View

Grandes reescritas foram feitas nos helpers do Action View, implementando ganchos Javascript Não-Obstrusivo (UJS) e removendo todos os comandos Ajax em linha. Isso permite ao Rails usar qualquer driver compatível com seu UJS para implementar ganchos UJS nos helpers.

O que isso significa é que qualquer helper remote_ anterior foi removido do núcleo do Rails e colocado no Helper Legado do Prototype. Para colocar ganchos UJS no seu HTML, você agora passa :remote => true. Por examplo:

1
form_for @post, :remote => true

Produz:

1
2
3
<html>
<form action="https://host.com" id="create-post" method="post" data-remote="true">
</html>

Active Model

O Active Model é novo no Rails 3.0. Ele fornece uma camada de abstração que qualquer biblioteca ORM pode usar para interagir com o Rails implementando uma interface Active Model.

Abstração de ORM e Interface do Action Pack

Parte do desacoplamento dos componentes núcleo foi extrair todas as ligações do Active Record do Action Pack. Isso foi completado. Todos os novos plugins de ORM agora só precisam implementar as interfaces do Active Model para funcionar sem problemas com o Action Pack.

Mais informações: – Faça Qualquer Objeto Ruby se Sentir como ActiveRecord

Validações

As validações foram movidas do Active Record para o Active Model, fornecendo uma interface para validações que funcionam em qualquer ORM no Rails 3.

NOTA: Todos os métodos de validação no estilo do Rails 2.3 ainda são suportados no Rails 3.0, o novo método de validação é projetado como uma ajuda adicional nas validações do seu model, não como um substituto para a API existente.

Você também pode passar um objeto validador, que pode ser reusado entre objetos que usam Active Model:

1
2
3
4
5
6
7
8
class TitleValidator < ActiveModel::EachValidator
  Titles = ['Mr.', 'Mrs.', 'Dr.']
  def validate_each(record, attribute, value)
    unless Titles.include?(value)
      record.errors[attribute] << 'must be a valid title'
    end
  end
end
1
2
3
4
5
6
7
8
9
10
11
class Person
  include ActiveModel::Validations
  attr_accessor :title
  validates :title, :presence => true, :title => true
end

# Ou para Active Record

class Person < ActiveRecord::Base
  validates :title, :presence => true, :title => true
end

Mais informações:

Active Record

O Active Record recebeu muita atenção no Rails 3.0, incluindo abstração no Active Model, uma completa atualização para a interface de Query usando Arel, atualizações de validações e muitas melhorias e consertos. Todas as APIs do Rails 2.x serão usáveis a partir de uma camada de compatibilidade que será suportada até a versão 3.1.

Interface de Query

O Active Record, através do uso do Arel, agora retorna relações nos seus métodos principais. A API existente no Rails 2.3.x ainda é suportada e não será deprecada até o Rails 3.1 e não será removida até o Rails 3.2, entretanto, as novas APIs fornecem os seguintes novos métodos, onde todos retornam relações que permitem que sejam encadeadas entre si:

Mais informações:

Melhorias

Patches e Deprecações

Adicionalmente, muitas correções no branch do Active Record:

Assim como as seguintes deprecações:

NOTA: Embora uma implementação de Máquina de Estado tenha existido no Active Record Edge por alguns meses, ele foi removido do lançamento do Rails 3.0.

Active Resource

O Active Resource também foi extraído do Active Model permitindo que você use objetos Active Resource com Action Pack sem problemas.

Deprecado:

Active Support

Um grande esforço foi feito no Active Suporte para tornar fácil pegar apenas os pedaços que interessa, ou seja, você não precisa mais requerer toda a biblioteca Active Support para pegar apenas alguns pedaços dele. Isso permite os vários componentes do Rails serem mais magros.

Estas são as principais mudanças no Active Support:

Os seguintes métodos foram removidos porque estão agora disponíveis no Ruby 1.8.7 e 1.9.

O patch de segurança para o REXML permanece no Active Support porque níveis de patch anteriores ao Ruby 1.8.7 ainda precisam disso. Active Support sabe quando deve aplicá-lo.

Os seguintes métodos foram removidos porque não são mais usados no framework:

Action Mailer

O Action Mailer ganhou uma nova API, substituindo o TMail pelo novo Mail como a biblioteca de Email. O próprio Action Mailer foi praticamente todo reescrito com praticamente toda linha de código tocada. O resultado é que o Action Mailer agora simplesmente herda do Abstract Controller e encapsula a gem Mail em uma DSL Rails. Isso reduz a quantidade de código e duplicação de outras bibliotecas consideravelmente.

Deprecado:

Mais informações:

Créditos

Veja a lista completa de contribuidores do Rails, para as muitas pessoas que gastaram muitas horas fazendo o Rails 3. Parabéns a todos eles.

As Anotações de Lançamento do Rails 3.0 foram compiladas por Mikel Lindsaar.

tags: obsolete rails

Comments

comentários deste blog disponibilizados por Disqus