edge
Mais em rubyonrails.org: Mais Ruby on Rails

Ruby on Rails 4.0 Notas de Lançamento

Destaques no Rails 4.0:

Estas notas de lançamento cobrem apenas as mudanças principais. Para saber sobre várias correções de bugs e mudanças, por favor, consulte os registros de alterações ou confira a lista de commits no repositório principal do Rails no GitHub.

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

Rails 4.0

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, para form_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.

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 ou html_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) e X-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.

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 e test/mailers. Tarefas rake correspondentes também foram adicionadas. (Pull Request)

  • Os executáveis do seu aplicativo agora estão no diretório bin/. Execute rake rails:update:bin para obter bin/bundle, bin/rails e bin/rake.

  • Threadsafe ativado por padrão.

  • A capacidade de usar um construtor personalizado passando --builder (ou -b) para rails new foi removida. Considere usar modelos de aplicativo em vez disso. (Pull Request)

6.2 Depreciações

  • config.threadsafe! está obsoleto em favor de config.eager_load, que fornece um controle mais refinado sobre o que é carregado antecipadamente.

  • Rails::Plugin foi removido. Em vez de adicionar plugins ao vendor/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 por dalli em ActiveSupport::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 e pluralize 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 novo Object#try!.

  • String#to_date agora gera ArgumentError: data inválida em vez de NoMethodError: undefined method 'div' for nil:NilClass quando uma data inválida é fornecida. Agora é o mesmo que Date.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, use skip 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, use Module#local_constants em seu lugar (que retorna símbolos).

  • ActiveSupport::BufferedLogger está obsoleto. Use ActiveSupport::Logger ou o logger da biblioteca padrão do Ruby.

  • Descontinuado assert_present e assert_blank em favor de assert object.blank? e assert 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étodos up e down desnecessários.

    • Os métodos drop_table e remove_column agora são reversíveis, desde que as informações necessárias sejam fornecidas. O método remove_column costumava aceitar vários nomes de colunas; em vez disso, use remove_columns (que não é reversível). O método change_table também é reversível, desde que seu bloco não chame remove, change ou change_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
  • 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 retornar self.

  • Model.all agora retorna uma ActiveRecord::Relation, em vez de um array de registros. Use Relation#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 e mysql2 definirão SQL_MODE=STRICT_ALL_TABLES por padrão para evitar perda silenciosa de dados. Isso pode ser desativado especificando strict: false no seu database.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 e ActiveRecord::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_... e find_by_...!, estão descontinuados. Aqui está como você pode reescrever o código:

    • find_all_by_... pode ser reescrito usando where(...).
    • find_last_by_... pode ser reescrito usando where(...).last.
    • scoped_by_... pode ser reescrito usando where(...).
    • find_or_initialize_by_... pode ser reescrito usando find_or_initialize_by(...).
    • find_or_create_by_... pode ser reescrito usando find_or_create_by(...).
    • find_or_create_by_...! pode ser reescrito usando find_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.