Para instalar o Rails 3:
# Use sudo se necessário para a sua configuração
$ gem install rails
1 Atualizando para o Rails 3
Se você está atualizando uma aplicação existente, é uma ótima ideia ter uma boa cobertura de testes antes de começar. Você também deve primeiro atualizar para o Rails 2.3.5 e garantir que sua aplicação ainda funcione conforme o esperado antes de tentar atualizar para o Rails 3. Em seguida, observe as seguintes mudanças:
1.1 Rails 3 requer pelo menos o Ruby 1.8.7
O Rails 3.0 requer o Ruby 1.8.7 ou superior. O suporte para todas as versões anteriores do Ruby foi oficialmente removido e você deve fazer a atualização o mais cedo possível. O Rails 3.0 também é compatível com o Ruby 1.9.2.
DICA: Note que as versões p248 e p249 do Ruby 1.8.7 têm bugs de marshalling que fazem o Rails 3.0 travar. O Ruby Enterprise Edition corrigiu esses bugs desde a versão 1.8.7-2010.02. No front do Ruby 1.9, o Ruby 1.9.1 não é utilizável porque ele simplesmente causa um segfault no Rails 3.0, então se você quiser usar o Rails 3 com o 1.9.x, use o 1.9.2 para uma experiência tranquila.
1.2 Objeto de Aplicação do Rails
Como parte do trabalho para suportar a execução de várias aplicações Rails no mesmo processo, o Rails 3 introduz o conceito de um objeto de Aplicação. Um objeto de aplicação contém todas as configurações específicas da aplicação e é muito semelhante em natureza ao config/environment.rb
das versões anteriores do Rails.
Agora, cada aplicação Rails deve ter um objeto de aplicação correspondente. O objeto de aplicação é definido em config/application.rb
. Se você está atualizando uma aplicação existente para o Rails 3, você deve adicionar este arquivo e mover as configurações apropriadas de config/environment.rb
para config/application.rb
.
1.3 script/* substituído por script/rails
O novo script/rails
substitui todos os scripts que costumavam estar no diretório script
. No entanto, você não executa script/rails
diretamente, o comando rails
detecta que está sendo invocado na raiz de uma aplicação Rails e executa o script para você. O uso pretendido é:
$ rails console # em vez de script/console
$ rails g scaffold post title:string # em vez de script/generate scaffold post title:string
Execute rails --help
para obter uma lista de todas as opções.
1.4 Dependências e config.gem
O método config.gem
foi removido e substituído pelo uso do bundler
e de um Gemfile
, veja Vendendo Gems abaixo.
1.5 Processo de Atualização
Para ajudar no processo de atualização, um plugin chamado Rails Upgrade foi criado para automatizar parte dele.
Basta instalar o plugin e, em seguida, executar rake rails:upgrade:check
para verificar sua aplicação em busca de partes que precisam ser atualizadas (com links para informações sobre como atualizá-las). Ele também oferece uma tarefa para gerar um Gemfile
com base nas suas chamadas atuais de config.gem
e uma tarefa para gerar um novo arquivo de rotas a partir do seu atual. Para obter o plugin, basta executar o seguinte:
bash
$ ruby script/plugin install git://github.com/rails/rails_upgrade.git
Você pode ver um exemplo de como isso funciona em Rails Upgrade is now an Official Plugin
Além da ferramenta Rails Upgrade, se você precisar de mais ajuda, existem pessoas no IRC e rubyonrails-talk que provavelmente estão fazendo a mesma coisa, possivelmente enfrentando os mesmos problemas. Certifique-se de compartilhar suas próprias experiências ao fazer o upgrade para que outros possam se beneficiar do seu conhecimento!
2 Criando uma aplicação Rails 3.0
# Você deve ter o RubyGem 'rails' instalado
$ rails new myapp
$ cd myapp
2.1 Vendendo Gems
O Rails agora usa um Gemfile
na raiz da aplicação para determinar as gems que você precisa para iniciar sua aplicação. Este Gemfile
é processado pelo Bundler, que então instala todas as suas dependências. Ele também pode instalar todas as dependências localmente em sua aplicação para que ela não dependa das gems do sistema.
Mais informações: - Página inicial do bundler
2.2 Vivendo no Limite
O Bundler
e o Gemfile
tornam fácil congelar sua aplicação Rails com o novo comando bundle
, então o rake freeze
não é mais relevante e foi removido.
Se você quiser agrupar diretamente do repositório Git, pode passar a flag --edge
:
$ rails new myapp --edge
Se você tiver um checkout local do repositório Rails e quiser gerar uma aplicação usando-o, pode passar a flag --dev
:
$ ruby /caminho/para/rails/bin/rails new myapp --dev
3 Mudanças Arquiteturais no Rails
Existem seis mudanças principais na arquitetura do Rails.
3.1 Railties Restrung
O Railties foi atualizado para fornecer uma API de plugin consistente para todo o framework Rails, bem como uma reescrita total dos geradores e das ligações do Rails. O resultado é que os desenvolvedores agora podem se conectar a qualquer estágio significativo dos geradores e do framework da aplicação de maneira consistente e definida.
3.2 Todos os componentes principais do Rails estão desacoplados
Com a fusão do Merb e do Rails, uma das grandes tarefas foi remover o acoplamento rígido entre os componentes principais do Rails. Isso agora foi alcançado, e todos os componentes principais do Rails agora estão usando a mesma API que você pode usar para desenvolver plugins. Isso significa que qualquer plugin que você faça, ou qualquer substituição de componente principal (como DataMapper ou Sequel), pode acessar todas as funcionalidades que os componentes principais do Rails têm acesso e estender e aprimorar à vontade.
Mais informações: - The Great Decoupling
3.3 Abstração do Active Model
Parte do desacoplamento dos componentes principais foi extrair todas as dependências do Active Record do Action Pack. Isso agora foi concluído. Todos os novos plugins ORM agora só precisam implementar as interfaces do Active Model para funcionar perfeitamente com o Action Pack.
Mais informações: - Make Any Ruby Object Feel Like ActiveRecord
3.4 Abstração do Controller
Outra grande parte do desacoplamento dos componentes principais foi criar uma superclasse base separada das noções de HTTP para lidar com a renderização de views, etc. Essa criação do AbstractController
permitiu que ActionController
e ActionMailer
fossem muito simplificados, com código comum removido de todas essas bibliotecas e colocado no Abstract Controller.
Mais informações: - Rails Edge Architecture
3.5 Integração do Arel
O Arel (ou Active Relation) foi adotado como base do Active Record e agora é necessário para o Rails. O Arel fornece uma abstração SQL que simplifica o Active Record e fornece a base para a funcionalidade de relação no Active Record.
Mais informações: - Why I wrote Arel
3.6 Extração do Mail
O Action Mailer, desde o início, teve patches, pré-parsers e até agentes de entrega e recebimento, além de ter o TMail vendido no repositório de origem. A versão 3 muda isso, com toda a funcionalidade relacionada a mensagens de e-mail abstraída para a gem Mail. Isso reduz novamente a duplicação de código e ajuda a criar limites definidos entre o Action Mailer e o analisador de e-mail.
Mais informações: - New Action Mailer API in Rails 3
4 Documentação
A documentação na árvore do Rails está sendo atualizada com todas as mudanças na API, além disso, os Rails Edge Guides estão sendo atualizados um por um para refletir as mudanças no Rails 3.0. Os guias em guides.rubyonrails.org, no entanto, continuarão a conter apenas a versão estável do Rails (atualmente, a versão 2.3.5, até que a versão 3.0 seja lançada).
Mais informações: - Projetos de Documentação do Rails
5 Internacionalização
Muito trabalho foi feito com o suporte a I18n no Rails 3, incluindo a última versão do I18n gem que fornece muitas melhorias de velocidade.
- I18n para qualquer objeto - O comportamento do I18n pode ser adicionado a qualquer objeto incluindo
ActiveModel::Translation
eActiveModel::Validations
. Também há um fallbackerrors.messages
para traduções. - Atributos podem ter traduções padrão.
- As tags de envio de formulário automaticamente puxam o status correto (Criar ou Atualizar) dependendo do status do objeto, e assim puxam a tradução correta.
- Labels com I18n agora funcionam apenas passando o nome do atributo.
Mais informações: - Mudanças no I18n do Rails 3
6 Railties
Com a desvinculação dos principais frameworks do Rails, o Railties passou por uma grande reformulação para tornar a conexão de frameworks, engines ou plugins o mais fácil e extensível possível:
- Cada aplicativo agora tem seu próprio espaço de nomes, a aplicação é iniciada com
YourAppName.boot
, por exemplo, tornando a interação com outros aplicativos muito mais fácil. - Qualquer coisa em
Rails.root/app
agora é adicionada ao caminho de carregamento, então você pode criarapp/observers/user_observer.rb
e o Rails irá carregá-lo sem nenhuma modificação. - O Rails 3.0 agora fornece um objeto
Rails.config
, que oferece um repositório central de todos os tipos de opções de configuração do Rails.
A geração de aplicativos recebeu flags extras que permitem pular a instalação do test-unit, Active Record, Prototype e Git. Também foi adicionada uma nova flag --dev
que configura o aplicativo com o Gemfile
apontando para o seu checkout do Rails (que é determinado pelo caminho para o binário rails
). Veja rails --help
para mais informações.
Os geradores do Railties receberam muita atenção no Rails 3.0, basicamente:
- Os geradores foram completamente reescritos e não são compatíveis com versões anteriores.
- A API de templates do Rails e a API de geradores foram mescladas (elas são as mesmas que as anteriores).
- Os geradores não são mais carregados de caminhos especiais, eles são apenas encontrados no caminho de carregamento do Ruby, então chamar
rails generate foo
irá procurar porgenerators/foo_generator
. - Novos geradores fornecem hooks, então qualquer mecanismo de template, ORM, framework de teste pode facilmente se conectar.
- Novos geradores permitem que você substitua os templates colocando uma cópia em
Rails.root/lib/templates
. Rails::Generators::TestCase
também é fornecido para que você possa criar seus próprios geradores e testá-los.
Além disso, as views geradas pelos geradores do Railties passaram por algumas mudanças:
- As views agora usam tags
div
em vez de tagsp
. - Os scaffolds gerados agora usam partials
_form
, em vez de código duplicado nas views de edição e nova. - Os formulários do scaffold agora usam
f.submit
, que retorna "Criar NomeDoModelo" ou "Atualizar NomeDoModelo" dependendo do estado do objeto passado.
Finalmente, algumas melhorias foram adicionadas às tarefas do rake:
- Foi adicionado o
rake db:forward
, permitindo que você avance suas migrações individualmente ou em grupos. - Foi adicionado o
rake routes CONTROLLER=x
, permitindo que você visualize apenas as rotas de um controlador.
O Railties agora deprecia:
RAILS_ROOT
em favor deRails.root
,RAILS_ENV
em favor deRails.env
, eRAILS_DEFAULT_LOGGER
em favor deRails.logger
.
PLUGIN/rails/tasks
e PLUGIN/tasks
não são mais carregados, todas as tarefas agora devem estar em PLUGIN/lib/tasks
.
Mais informações:
7 Action Pack
Houve mudanças significativas internas e externas no Action Pack.
7.1 Controlador Abstrato
O Controlador Abstrato extrai as partes genéricas do Action Controller em um módulo reutilizável que qualquer biblioteca pode usar para renderizar templates, renderizar partials, helpers, traduções, logging, qualquer parte do ciclo de resposta da requisição. Essa abstração permitiu que o ActionMailer::Base
agora apenas herde do AbstractController
e envolva a DSL do Rails no gem Mail.
Também proporcionou uma oportunidade para limpar o Action Controller, abstraindo o que poderia simplificar o código.
No entanto, observe que o Controlador Abstrato não é uma API voltada para o usuário, você não irá encontrá-lo em seu uso diário do Rails.
Mais informações: - Arquitetura do Rails Edge
7.2 Action Controller
application_controller.rb
agora temprotect_from_forgery
ativado por padrão.- O
cookie_verifier_secret
foi depreciado e agora é atribuído através deRails.application.config.cookie_secret
e movido para seu próprio arquivo:config/initializers/cookie_verification_secret.rb
. - O
session_store
era configurado emActionController::Base.session
, e agora foi movido paraRails.application.config.session_store
. As configurações padrão são definidas emconfig/initializers/session_store.rb
. cookies.secure
permite que você defina valores criptografados nos cookies comcookie.secure[:key] => value
.cookies.permanent
permite que você defina valores permanentes no hash de cookiescookie.permanent[:key] => value
que levantam exceções em valores assinados se houver falhas de verificação.- Agora você pode passar
:notice => 'Esta é uma mensagem flash'
ou:alert => 'Algo deu errado'
para a chamadaformat
dentro de um blocorespond_to
. O hashflash[]
ainda funciona como antes. - O método
respond_with
agora foi adicionado aos seus controladores, simplificando os veneráveis blocosformat
. Foi adicionado o
ActionController::Responder
, permitindo flexibilidade na geração de suas respostas. Depreciações:filter_parameter_logging
está depreciado em favor deconfig.filter_parameters << :password
.
Mais informações:
7.3 Action Dispatch
Action Dispatch é novo no Rails 3.0 e fornece uma nova implementação mais limpa para roteamento.
- Grande limpeza e reescrita do roteador, o roteador do Rails agora é
rack_mount
com uma DSL do Rails por cima, é um software independente. As rotas definidas por cada aplicação agora estão dentro do namespace do módulo da sua aplicação, ou seja:
# Em vez de: ActionController::Routing::Routes.draw do |map| map.resources :posts end # Você faz: AppName::Application.routes do resources :posts end
Adicionado o método
match
ao roteador, você também pode passar qualquer aplicação Rack para a rota correspondente.Adicionado o método
constraints
ao roteador, permitindo que você proteja rotas com restrições definidas.Adicionado o método
scope
ao roteador, permitindo que você crie namespaces para rotas em diferentes idiomas ou ações diferentes, por exemplo:scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # Isso te dá a ação de edição com /es/proyecto/1/cambiar
Adicionado o método
root
ao roteador como um atalho paramatch '/', :to => path
.Você pode passar segmentos opcionais para o match, por exemplo
match "/:controller(/:action(/:id))(.:format)"
, cada segmento entre parênteses é opcional.Rotas podem ser expressas através de blocos, por exemplo você pode chamar
controller :home { match '/:action' }
.
NOTA. Os comandos no estilo antigo map
ainda funcionam como antes com uma camada de compatibilidade reversa, no entanto isso será removido na versão 3.1.
Depreciações
- A rota de captura para aplicações não-REST (
/:controller/:action/:id
) agora está comentada. - A opção
:path_prefix
não existe mais e:name_prefix
agora adiciona automaticamente "_" no final do valor fornecido.
Mais informações: * O Roteador do Rails 3: Rack it Up * Rotas Renovadas no Rails 3 * Ações Genéricas no Rails 3
7.4 Action View
7.4.1 JavaScript não intrusivo
Foi feita uma grande reescrita nos helpers do Action View, implementando ganchos de JavaScript não intrusivo (UJS) e removendo os antigos comandos AJAX inline. Isso permite que o Rails use qualquer driver UJS compatível para implementar os ganchos UJS nos helpers.
O que isso significa é que todos os antigos helpers remote_<method>
foram removidos do núcleo do Rails e colocados no Prototype Legacy Helper. Para adicionar ganchos UJS ao seu HTML, agora você passa :remote => true
. Por exemplo:
form_for @post, :remote => true
Produz:
<form action="http://host.com" id="create-post" method="post" data-remote="true">
7.4.2 Helpers com blocos
Helpers como form_for
ou div_for
que inserem conteúdo de um bloco agora usam <%=
:
<%= form_for @post do |f| %>
...
<% end %>
Seus próprios helpers desse tipo devem retornar uma string, em vez de anexar ao buffer de saída manualmente.
Helpers que fazem outra coisa, como cache
ou content_for
, não são afetados por essa mudança, eles precisam de <%
como antes.
7.4.3 Outras mudanças
- Você não precisa mais chamar
h(string)
para escapar a saída HTML, isso está ativado por padrão em todos os templates de visualização. Se você quiser a string não escapada, chameraw(string)
. - Os helpers agora geram HTML5 por padrão.
- O helper de rótulo de formulário agora busca os valores do I18n com um único valor, então
f.label :name
buscará a tradução:name
. - A tradução do rótulo de seleção do I18n agora deve ser :en.helpers.select em vez de :en.support.select.
- Você não precisa mais colocar um sinal de menos no final de uma interpolação Ruby dentro de um template ERB para remover a quebra de linha no final na saída HTML.
- Adicionado o helper
grouped_collection_select
ao Action View. - Foi adicionado o
content_for?
, permitindo que você verifique a existência de conteúdo em uma visualização antes de renderizar. - passar
:value => nil
para os helpers de formulário definirá o atributovalue
do campo como nulo, em vez de usar o valor padrão - passar
:id => nil
para os helpers de formulário fará com que esses campos sejam renderizados sem o atributoid
- passar
:alt => nil
paraimage_tag
fará com que a tagimg
seja renderizada sem o atributoalt
8 Active Model
Active Model é novo no Rails 3.0. Ele fornece uma camada de abstração para qualquer biblioteca ORM interagir com o Rails, implementando uma interface Active Model.
8.1 Abstração ORM e Interface Action Pack
Parte da desacoplagem dos componentes principais foi extrair todas as dependências do Active Record do Action Pack. Isso agora foi concluído. Todos os novos plugins ORM agora só precisam implementar as interfaces do Active Model para funcionar perfeitamente com o Action Pack.
Mais informações: - Faça qualquer objeto Ruby se sentir como ActiveRecord
8.2 Validações
As validações foram movidas do Active Record para o Active Model, fornecendo uma interface para validações que funciona em bibliotecas ORM diferentes no Rails 3.
- Agora há um método de atalho
validates :atributo, options_hash
que permite passar opções para todos os métodos de validação da classe, você pode passar mais de uma opção para um método de validação. - O método
validates
tem as seguintes opções::acceptance => Boolean
.:confirmation => Boolean
.:exclusion => { :in => Enumerable }
.:inclusion => { :in => Enumerable }
.:format => { :with => Regexp, :on => :create }
.:length => { :maximum => Fixnum }
.:numericality => Boolean
.:presence => Boolean
.:uniqueness => Boolean
.
NOTA: Todos os métodos de validação no estilo da versão 2.3 do Rails ainda são suportados no Rails 3.0, o novo método validates é projetado como uma ajuda adicional nas validações do seu modelo, não uma substituição para a API existente.
Você também pode passar um objeto validador, que você pode reutilizar entre objetos que usam o Active Model:
class TitleValidator < ActiveModel::EachValidator
Titles = ['Sr.', 'Sra.', 'Dr.']
def validate_each(record, attribute, value)
unless Titles.include?(value)
record.errors[attribute] << 'deve ser um título válido'
end
end
end
class Person
include ActiveModel::Validations
attr_accessor :title
validates :title, :presence => true, :title => true
end
# Ou para o Active Record
class Person < ActiveRecord::Base
validates :title, :presence => true, :title => true
end
Também há suporte para introspecção:
User.validators
User.validators_on(:login)
Mais informações:
9 Active Record
O Active Record recebeu muita atenção no Rails 3.0, incluindo a abstração para o Active Model, uma atualização completa da interface de consulta usando o Arel, atualizações de validação e muitas melhorias e correções. Toda a API do Rails 2.x será utilizável através de uma camada de compatibilidade que será suportada até a versão 3.1.
9.1 Interface de Consulta
O Active Record, através do uso do Arel, agora retorna relações em seus métodos principais. A API existente no Rails 2.3.x ainda é suportada e não será depreciada até o Rails 3.1 e não será removida até o Rails 3.2, no entanto, a nova API fornece os seguintes novos métodos que retornam relações permitindo que sejam encadeados:
where
- fornece condições na relação, o que é retornado.select
- escolhe quais atributos dos modelos você deseja que sejam retornados do banco de dados.group
- agrupa a relação no atributo fornecido.having
- fornece uma expressão limitando as relações de grupo (restrição GROUP BY).joins
- une a relação a outra tabela.clause
- fornece uma expressão limitando as relações de junção (restrição JOIN).includes
- inclui outras relações pré-carregadas.order
- ordena a relação com base na expressão fornecida.limit
- limita a relação ao número de registros especificado.lock
- bloqueia os registros retornados da tabela.readonly
- retorna uma cópia somente leitura dos dados.from
- fornece uma maneira de selecionar relacionamentos de mais de uma tabela.scope
- (anteriormentenamed_scope
) retorna relações e pode ser encadeado com os outros métodos de relação.with_scope
- ewith_exclusive_scope
agora também retornam relações e podem ser encadeados.default_scope
- também funciona com relações.
Mais informações:
9.2 Melhorias
- Adicionado
:destroyed?
aos objetos do Active Record. - Adicionado
:inverse_of
às associações do Active Record, permitindo que você obtenha a instância de uma associação já carregada sem acessar o banco de dados.
9.3 Correções e Depreciações
Além disso, muitas correções foram feitas no ramo do Active Record:
- O suporte ao SQLite 2 foi abandonado em favor do SQLite 3.
- Suporte MySQL para ordem de colunas.
- O adaptador do PostgreSQL teve seu suporte
TIME ZONE
corrigido para não inserir valores incorretos. - Suporte a esquemas múltiplos em nomes de tabelas para o PostgreSQL.
- Suporte do PostgreSQL para coluna do tipo de dados XML.
table_name
agora é armazenado em cache.Um grande trabalho também foi feito no adaptador do Oracle, com muitas correções de bugs. Além das seguintes depreciações:
named_scope
em uma classe Active Record está obsoleto e foi renomeado para apenasscope
.Nos métodos
scope
, você deve passar a usar os métodos de relação, em vez de um método de busca:conditions => {}
, por exemplo,scope :since, lambda {|time| where("created_at > ?", time) }
.save(false)
está obsoleto, em favor desave(:validate => false)
.As mensagens de erro I18n para Active Record devem ser alteradas de :en.activerecord.errors.template para
:en.errors.template
.model.errors.on
está obsoleto, em favor demodel.errors[]
validates_presence_of => validates... :presence => true
ActiveRecord::Base.colorize_logging
econfig.active_record.colorize_logging
estão obsoletos, em favor deRails::LogSubscriber.colorize_logging
ouconfig.colorize_logging
NOTA: Embora uma implementação de State Machine tenha sido adicionada ao Active Record há alguns meses, ela foi removida do lançamento do Rails 3.0.
10 Active Resource
O Active Resource também foi extraído para o Active Model, permitindo que você use objetos Active Resource com o Action Pack de forma transparente.
- Adicionadas validações através do Active Model.
- Adicionados ganchos de observação.
- Suporte a proxy HTTP.
- Adicionado suporte para autenticação digest.
- Movida a nomenclatura do modelo para o Active Model.
- Alterados os atributos do Active Resource para um Hash com acesso indiferente.
- Adicionados os aliases
first
,last
eall
para escopos de busca equivalentes. find_every
agora não retorna um erroResourceNotFound
se nada for retornado.- Adicionado
save!
que gera uma exceçãoResourceInvalid
a menos que o objeto sejavalid?
. update_attribute
eupdate_attributes
adicionados aos modelos do Active Resource.- Adicionado
exists?
. - Renomeada
SchemaDefinition
paraSchema
edefine_schema
paraschema
. - Usa o formato de recursos ativos (
format
) em vez do tipo de conteúdo remoto (content-type
) para carregar erros. - Usa
instance_eval
para o bloco de esquema. - Corrige
ActiveResource::ConnectionError#to_s
quando@response
não responde a #code ou #message, lida com a compatibilidade do Ruby 1.9. - Adiciona suporte para erros no formato JSON.
- Garante que
load
funcione com arrays numéricos. - Reconhece uma resposta 410 do recurso remoto como o recurso sendo excluído.
- Adiciona capacidade de definir opções SSL em conexões do Active Resource.
- Definir o tempo limite da conexão também afeta o
Net::HTTP
open_timeout
.
Depreciações:
save(false)
está obsoleto, em favor desave(:validate => false)
.- Ruby 1.9.2:
URI.parse
e.decode
estão obsoletos e não são mais usados na biblioteca.
11 Active Support
Um grande esforço foi feito no Active Support para torná-lo selecionável, ou seja, você não precisa mais requerer toda a biblioteca do Active Support para obter partes dela. Isso permite que os vários componentes principais do Rails sejam executados de forma mais enxuta.
Estas são as principais mudanças no Active Support:
- Grande limpeza da biblioteca, removendo métodos não utilizados em todo o código.
- O Active Support não fornece mais versões vendidas do TZInfo, Memcache Client e Builder. Todos eles são incluídos como dependências e instalados através do comando
bundle install
. - Buffers seguros são implementados em
ActiveSupport::SafeBuffer
. - Adicionados
Array.uniq_by
eArray.uniq_by!
. - Removido
Array#rand
e adicionadoArray#sample
do Ruby 1.9. - Corrigido bug em
TimeZone.seconds_to_utc_offset
que retornava um valor incorreto. - Adicionado middleware
ActiveSupport::Notifications
. ActiveSupport.use_standard_json_time_format
agora tem como padrão true.ActiveSupport.escape_html_entities_in_json
agora tem como padrão false.Integer#multiple_of?
aceita zero como argumento, retorna false a menos que o receptor seja zero.string.chars
foi renomeado parastring.mb_chars
.ActiveSupport::OrderedHash
agora pode ser deserializado através do YAML.- Adicionado parser baseado em SAX para XmlMini, usando LibXML e Nokogiri.
- Adicionado
Object#presence
que retorna o objeto se ele for#present?
, caso contrário, retornanil
. - Adicionada extensão central
String#exclude?
que retorna o inverso de#include?
. - Adicionado
to_i
paraDateTime
emActiveSupport
, para queto_yaml
funcione corretamente em modelos com atributosDateTime
. - Adicionado
Enumerable#exclude?
para trazer paridade comEnumerable#include?
e evitar!x.include?
. - Ativar por padrão a proteção contra XSS no Rails.
- Suporte a mesclagem profunda em
ActiveSupport::HashWithIndifferentAccess
. Enumerable#sum
agora funciona com todos os enumeráveis, mesmo que eles não respondam a:size
.inspect
em uma duração de comprimento zero retorna '0 segundos' em vez de uma string vazia.- Adicionados
element
ecollection
aModelName
. String#to_time
eString#to_datetime
lidam com segundos fracionados.- Adicionado suporte a novos callbacks para objeto de filtro ao redor que responde a
:before
e:after
usados em callbacks antes e depois. - O método
ActiveSupport::OrderedHash#to_a
retorna um conjunto ordenado de arrays. Corresponde aoHash#to_a
do Ruby 1.9. MissingSourceFile
existe como uma constante, mas agora é igual aLoadError
.- Adicionado
Class#class_attribute
, para poder declarar um atributo de nível de classe cujo valor é herdável e pode ser sobrescrito por subclasses. - Finalmente removido
DeprecatedCallbacks
emActiveRecord::Associations
. Object#metaclass
agora éKernel#singleton_class
para corresponder ao Ruby. Os seguintes métodos foram removidos porque agora estão disponíveis no Ruby 1.8.7 e 1.9.Integer#even?
eInteger#odd?
String#each_char
String#start_with?
eString#end_with?
(aliases da terceira pessoa ainda foram mantidos)String#bytesize
Object#tap
Symbol#to_proc
Object#instance_variable_defined?
Enumerable#none?
O patch de segurança para REXML permanece no Active Support porque as primeiras versões do Ruby 1.8.7 ainda precisam dele. O Active Support sabe se deve aplicá-lo ou não.
Os seguintes métodos foram removidos porque não são mais usados no framework:
Kernel#daemonize
Object#remove_subclasses_of
Object#extend_with_included_modules_from
,Object#extended_by
Class#remove_class
Regexp#number_of_captures
,Regexp.unoptionalize
,Regexp.optionalize
,Regexp#number_of_captures
12 Action Mailer
O Action Mailer recebeu uma nova API com o TMail sendo substituído pelo novo Mail como biblioteca de e-mail. O Action Mailer em si foi completamente reescrito, com praticamente todas as linhas de código sendo modificadas. O resultado é que o Action Mailer agora simplesmente herda do Abstract Controller e envolve a gem Mail em um DSL do Rails. Isso reduz consideravelmente a quantidade de código e duplicação de outras bibliotecas no Action Mailer.
- Todos os mailers agora estão em
app/mailers
por padrão. - Agora é possível enviar e-mails usando a nova API com três métodos:
attachments
,headers
email
. - O Action Mailer agora possui suporte nativo para anexos inline usando o método
attachments.inline
. - Os métodos de envio de e-mail do Action Mailer agora retornam objetos
Mail::Message
, que podem então enviar a si mesmos a mensagemdeliver
. - Todos os métodos de envio de e-mail agora estão abstraídos na gem Mail.
- O método de envio de e-mail pode aceitar um hash de todos os campos de cabeçalho de e-mail válidos com seus pares de valor.
- O método de envio
mail
age de maneira semelhante aorespond_to
do Action Controller, e você pode renderizar templates explicitamente ou implicitamente. O Action Mailer transformará o e-mail em um e-mail multipart, se necessário. - É possível passar um proc para as chamadas
format.mime_type
dentro do bloco de e-mail e renderizar explicitamente tipos específicos de texto, ou adicionar layouts ou templates diferentes. A chamadarender
dentro do proc é do Abstract Controller e suporta as mesmas opções. - O que eram testes unitários de mailer foram movidos para testes funcionais.
- O Action Mailer agora delega toda a codificação automática de campos de cabeçalho e corpos para a gem Mail.
- O Action Mailer irá codificar automaticamente os corpos e cabeçalhos de e-mail para você.
Depreciações:
:charset
,:content_type
,:mime_version
,:implicit_parts_order
estão todos depreciados em favor das declarações no estiloActionMailer.default :key => value
.- Os métodos dinâmicos
create_method_name
edeliver_method_name
do Mailer estão depreciados, basta chamarmethod_name
que agora retorna um objetoMail::Message
. ActionMailer.deliver(message)
está depreciado, basta chamarmessage.deliver
.template_root
está depreciado, passe opções para uma chamada de render dentro de um proc do métodoformat.mime_type
dentro do bloco de geração demail
.- O método
body
para definir variáveis de instância está depreciado (body {:ivar => value}
), basta declarar as variáveis de instância diretamente no método e elas estarão disponíveis na view. - O uso de mailers em
app/models
está depreciado, useapp/mailers
em vez disso.
Mais informações:
13 Créditos
Veja a lista completa de contribuidores para o Rails para as muitas pessoas que passaram muitas horas fazendo o Rails 3. Parabéns a todos eles.
As Notas de Lançamento do Rails 3.0 foram compiladas por Mikel Lindsaar.
Feedback
Você é incentivado a ajudar a melhorar a qualidade deste guia.
Por favor, contribua se encontrar algum erro de digitação ou factual. Para começar, você pode ler nossa contribuição à documentação seção.
Você também pode encontrar conteúdo incompleto ou desatualizado. Por favor, adicione qualquer documentação ausente para o principal. Certifique-se de verificar Guias Edge primeiro para verificar se os problemas já foram corrigidos ou não no branch principal. Verifique as Diretrizes dos Guias do Ruby on Rails para estilo e convenções.
Se por algum motivo você encontrar algo para corrigir, mas não puder corrigi-lo você mesmo, por favor abra uma issue.
E por último, mas não menos importante, qualquer tipo de discussão sobre a documentação do Ruby on Rails é muito bem-vinda no Fórum oficial do Ruby on Rails.