1 Atualizando para o Rails 4.0
Se você está atualizando um aplicativo existente, é uma ótima ideia ter uma boa cobertura de testes antes de começar. Você também deve primeiro atualizar para o Rails 3.2, caso ainda não tenha feito isso, e garantir que seu aplicativo ainda funcione como esperado antes de tentar uma atualização para o Rails 4.0. Uma lista de coisas a observar ao atualizar está disponível no guia Atualizando o Ruby on Rails.
2 Criando um aplicativo Rails 4.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 do aplicativo para determinar as gems que você precisa para iniciar seu aplicativo. Este Gemfile
é processado pela gem Bundler, que então instala todas as dependências. Ele até mesmo pode instalar todas as dependências localmente para o seu aplicativo, para que ele não dependa das gems do sistema.
Mais informações: Página do Bundler
2.2 Vivendo no Limite
O Bundler
e o Gemfile
tornam fácil congelar seu aplicativo Rails com o novo comando bundle
dedicado. Se você quiser agrupar diretamente do repositório Git, você pode passar a flag --edge
:
$ rails new myapp --edge
Se você tiver um checkout local do repositório do Rails e quiser gerar um aplicativo usando isso, você pode passar a flag --dev
:
$ ruby /caminho/para/rails/railties/bin/rails new myapp --dev
3 Principais Recursos
3.1 Atualização
- Ruby 1.9.3 (commit) - Ruby 2.0 preferido; 1.9.3+ requerido
- Nova política de depreciação - Recursos depreciados são avisos no Rails 4.0 e serão removidos no Rails 4.1.
- Caching de página e ação do ActionPack (commit) - O caching de página e ação são extraídos para uma gem separada. O caching de página e ação requer muita intervenção manual (expirar caches manualmente quando os objetos do modelo subjacente são atualizados). Em vez disso, use o caching em forma de Boneca Russa.
- Observadores do ActiveRecord (commit) - Os observadores são extraídos para uma gem separada. Os observadores são necessários apenas para o caching de página e ação, e podem levar a código spaghetti.
- Armazenamento de sessão do ActiveRecord (commit) - O armazenamento de sessão do ActiveRecord é extraído para uma gem separada. Armazenar sessões em SQL é custoso. Em vez disso, use sessões de cookie, sessões de memcache ou um armazenamento de sessão personalizado.
- Proteção de atribuição em massa do ActiveModel (commit) - A proteção de atribuição em massa do Rails 3 é depreciada. Em vez disso, use parâmetros fortes.
- ActiveResource (commit) - ActiveResource é extraído para uma gem separada. O ActiveResource não era amplamente utilizado.
- vendor/plugins removido (commit) - Use um
Gemfile
para gerenciar as gems instaladas.
3.2 ActionPack
- Parâmetros fortes (commit) - Permita apenas parâmetros permitidos para atualizar objetos do modelo (
params.permit(:title, :text)
). - Preocupações de roteamento (commit) - Na DSL de roteamento, extraia sub-rotas comuns (
comments
de/posts/1/comments
e/videos/1/comments
). - ActionController::Live (commit) - Transmita JSON com
response.stream
. - ETags declarativos (commit) - Adicione adições de etag no nível do controlador que farão parte do cálculo do etag da ação.
- Caching em forma de Boneca Russa (commit) - Faça cache de fragmentos aninhados de visualizações. Cada fragmento expira com base em um conjunto de dependências (uma chave de cache). A chave de cache geralmente é um número de versão do template e um objeto do modelo.
- Turbolinks (commit) - Sirva apenas uma página HTML inicial. Quando o usuário navegar para outra página, use pushState para atualizar a URL e use AJAX para atualizar o título e o corpo.
- Desacoplar ActionView de ActionController (commit) - ActionView foi desacoplado do ActionPack e será movido para uma gem separada no Rails 4.1.
Não depender do ActiveModel (commit) - ActionPack não depende mais do ActiveModel.
Geral
- ActiveModel::Model (commit) -
ActiveModel::Model
, uma mistura para fazer objetos Ruby normais funcionarem com o ActionPack (por exemplo, paraform_for
). - Nova API de escopo (commit) - Os escopos devem sempre usar chamáveis.
- Despejo de cache de esquema (commit) - Para melhorar o tempo de inicialização do Rails, em vez de carregar o esquema diretamente do banco de dados, carregue o esquema de um arquivo de despejo.
- Suporte para especificar o nível de isolamento da transação (commit) - Escolha se leituras repetíveis ou desempenho aprimorado (menos bloqueio) são mais importantes.
- Dalli (commit) - Use o cliente de memcache Dalli para a loja de memcache.
- Notificações de início e término (commit) - O Active Support Instrumentation relata notificações de início e término para assinantes.
- Thread safe por padrão (commit) - O Rails pode ser executado em servidores de aplicativos com threads sem configuração adicional.
- ActiveModel::Model (commit) -
NOTA: Verifique se as gems que você está usando são thread-safe.
- Verbo PATCH (commit) - No Rails, PATCH substitui PUT. PATCH é usado para atualizações parciais de recursos.
3.3 Segurança
- match não captura tudo (commit) - Na DSL de roteamento, o match requer que o verbo HTTP seja especificado.
- entidades HTML escapadas por padrão (commit) - Strings renderizadas em erb são escapadas a menos que sejam envolvidas com
raw
ouhtml_safe
seja chamado. - Novos cabeçalhos de segurança (commit) - O Rails envia os seguintes cabeçalhos com cada solicitação HTTP:
X-Frame-Options
(impede o clickjacking, proibindo o navegador de incorporar a página em um quadro),X-XSS-Protection
(pede ao navegador para interromper a injeção de script) eX-Content-Type-Options
(impede o navegador de abrir um jpeg como um exe).
4 Extração de recursos para gems
No Rails 4.0, vários recursos foram extraídos para gems. Você pode simplesmente adicionar as gems extraídas ao seu Gemfile
para trazer a funcionalidade de volta.
- Métodos de busca baseados em hash e dinâmicos (GitHub)
- Proteção contra atribuição em massa em modelos Active Record (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Observadores do Active Record (GitHub, Commit)
- Active Resource (GitHub, Pull Request, Blog)
- Action Caching (GitHub, Pull Request)
- Page Caching (GitHub, Pull Request)
- Sprockets (GitHub)
- Testes de desempenho (GitHub, Pull Request)
5 Documentação
Os guias foram reescritos em Markdown com suporte ao GitHub Flavored Markdown.
Os guias têm um design responsivo.
6 Railties
Consulte o Changelog para obter alterações detalhadas.
6.1 Mudanças notáveis
Novos locais de teste
test/models
,test/helpers
,test/controllers
etest/mailers
. Tarefas rake correspondentes também foram adicionadas. (Pull Request)Os executáveis do seu aplicativo agora estão no diretório
bin/
. Executerake rails:update:bin
para obterbin/bundle
,bin/rails
ebin/rake
.Threadsafe ativado por padrão.
A capacidade de usar um construtor personalizado passando
--builder
(ou-b
) pararails new
foi removida. Considere usar modelos de aplicativo em vez disso. (Pull Request)
6.2 Depreciações
config.threadsafe!
está obsoleto em favor deconfig.eager_load
, que fornece um controle mais refinado sobre o que é carregado antecipadamente.Rails::Plugin
foi removido. Em vez de adicionar plugins aovendor/plugins
, use gems ou bundler com dependências de caminho ou git.
7 Action Mailer
Consulte o Changelog para obter alterações detalhadas.
7.1 Mudanças notáveis
7.2 Depreciações
8 Active Model
Consulte o Changelog para obter alterações detalhadas.
8.1 Mudanças notáveis
Adicionado
ActiveModel::ForbiddenAttributesProtection
, um módulo simples para proteger atributos de atribuição em massa quando atributos não permitidos são passados.Adicionado
ActiveModel::Model
, uma mistura para fazer objetos Ruby funcionarem com o Action Pack sem precisar de configurações adicionais.
8.2 Descontinuações
9 Active Support
Consulte o Changelog para obter detalhes das mudanças.
9.1 Mudanças notáveis
Substituída a gem
memcache-client
obsoleta pordalli
emActiveSupport::Cache::MemCacheStore
.Otimizado
ActiveSupport::Cache::Entry
para reduzir o uso de memória e processamento.As inflexões agora podem ser definidas por localidade.
singularize
epluralize
aceitam a localidade como um argumento adicional.Object#try
agora retornará nil em vez de lançar um NoMethodError se o objeto receptor não implementar o método, mas você ainda pode obter o comportamento antigo usando o novoObject#try!
.String#to_date
agora geraArgumentError: data inválida
em vez deNoMethodError: undefined method 'div' for nil:NilClass
quando uma data inválida é fornecida. Agora é o mesmo queDate.parse
e aceita mais datas inválidas do que na versão 3.x, como:# ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass # ActiveSupport 4 "asdf".to_date # => ArgumentError: data inválida "333".to_date # => Fri, 29 Nov 2013
9.2 Descontinuações
Descontinuado o método
ActiveSupport::TestCase#pending
, useskip
do minitest em seu lugar.ActiveSupport::Benchmarkable#silence
foi descontinuado devido à falta de segurança de thread. Ele será removido sem substituição no Rails 4.1.ActiveSupport::JSON::Variable
está obsoleto. Defina seus próprios métodos#as_json
e#encode_json
para literais de string JSON personalizados.Descontinua o método de compatibilidade
Module#local_constant_names
, useModule#local_constants
em seu lugar (que retorna símbolos).ActiveSupport::BufferedLogger
está obsoleto. UseActiveSupport::Logger
ou o logger da biblioteca padrão do Ruby.Descontinuado
assert_present
eassert_blank
em favor deassert object.blank?
eassert object.present?
10 Action Pack
Consulte o Changelog para obter detalhes das mudanças.
10.1 Mudanças notáveis
- Alterado o estilo da folha de estilos das páginas de exceção para o modo de desenvolvimento. Além disso, exibe também a linha de código e o fragmento que geraram a exceção em todas as páginas de exceção.
10.2 Descontinuações
11 Active Record
Consulte o Changelog para obter detalhes das mudanças.
11.1 Mudanças notáveis
Melhoradas as formas de escrever migrações
change
, tornando os antigos métodosup
edown
desnecessários.- Os métodos
drop_table
eremove_column
agora são reversíveis, desde que as informações necessárias sejam fornecidas. O métodoremove_column
costumava aceitar vários nomes de colunas; em vez disso, useremove_columns
(que não é reversível). O métodochange_table
também é reversível, desde que seu bloco não chameremove
,change
ouchange_default
- O novo método
reversible
permite especificar o código a ser executado ao migrar para cima ou para baixo. Consulte o Guia de Migração - O novo método
revert
irá reverter uma migração inteira ou o bloco fornecido. Se estiver migrando para baixo, a migração/bloco fornecido é executado normalmente. Consulte o Guia de Migração
- Os métodos
Adicionado suporte ao tipo de array do PostgreSQL. Qualquer tipo de dado pode ser usado para criar uma coluna de array, com suporte completo para migração e geração de esquema.
Adicionado
Relation#load
para carregar explicitamente o registro e retornarself
.Model.all
agora retorna umaActiveRecord::Relation
, em vez de um array de registros. UseRelation#to_a
se realmente desejar um array. Em alguns casos específicos, isso pode causar problemas ao atualizar.Adicionado
ActiveRecord::Migration.check_pending!
que gera um erro se houver migrações pendentes.Adicionado suporte a codificadores personalizados para
ActiveRecord::Store
. Agora você pode definir seu codificador personalizado desta forma:store :settings, accessors: [ :color, :homepage ], coder: JSON
As conexões
mysql
emysql2
definirãoSQL_MODE=STRICT_ALL_TABLES
por padrão para evitar perda silenciosa de dados. Isso pode ser desativado especificandostrict: false
no seudatabase.yml
.Removido IdentityMap.
Removida a execução automática de consultas EXPLAIN. A opção
active_record.auto_explain_threshold_in_seconds
não é mais usada e deve ser removida.Adiciona
ActiveRecord::NullRelation
eActiveRecord::Relation#none
implementando o padrão de objeto nulo para a classe Relation.Adicionado auxiliar de migração
create_join_table
para criar tabelas de junção HABTM.Permite a criação de registros hstore no PostgreSQL.
11.2 Descontinuações
Descontinuada a API de busca antiga baseada em hash. Isso significa que os métodos que anteriormente aceitavam "opções de busca" não o fazem mais.
Todos os métodos dinâmicos, exceto
find_by_...
efind_by_...!
, estão descontinuados. Aqui está como você pode reescrever o código:find_all_by_...
pode ser reescrito usandowhere(...)
.find_last_by_...
pode ser reescrito usandowhere(...).last
.scoped_by_...
pode ser reescrito usandowhere(...)
.find_or_initialize_by_...
pode ser reescrito usandofind_or_initialize_by(...)
.find_or_create_by_...
pode ser reescrito usandofind_or_create_by(...)
.find_or_create_by_...!
pode ser reescrito usandofind_or_create_by!(...)
.
12 Créditos
Consulte a lista completa de contribuidores para o Rails para ver as muitas pessoas que passaram muitas horas fazendo do Rails o framework estável e robusto que ele é. Parabéns a todos eles.
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.