edge
Mais em rubyonrails.org: Mais Ruby on Rails

Notas de lançamento do Ruby on Rails 5.1

Destaques do Rails 5.1:

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

1 Atualizando para o Rails 5.1

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 5.0, caso ainda não tenha feito isso, e garantir que seu aplicativo ainda funcione conforme o esperado antes de tentar uma atualização para o Rails 5.1. Uma lista de coisas a serem observadas ao atualizar está disponível no guia Atualizando o Ruby on Rails.

2 Recursos Principais

2.1 Suporte ao Yarn

Pull Request

O Rails 5.1 permite gerenciar dependências JavaScript do npm via Yarn. Isso facilitará o uso de bibliotecas como React, VueJS ou qualquer outra biblioteca do mundo npm. O suporte ao Yarn está integrado ao pipeline de ativos para que todas as dependências funcionem perfeitamente com o aplicativo Rails 5.1.

2.2 Suporte opcional ao Webpack

Pull Request

Os aplicativos Rails podem integrar-se ao Webpack, um empacotador de ativos JavaScript, de forma mais fácil usando a nova gem Webpacker. Use a flag --webpack ao gerar novos aplicativos para habilitar a integração com o Webpack.

Isso é totalmente compatível com o pipeline de ativos, que você pode continuar usando para imagens, fontes, sons e outros ativos. Você até pode ter algum código JavaScript gerenciado pelo pipeline de ativos e outro código processado via Webpack. Tudo isso é gerenciado pelo Yarn, que está habilitado por padrão.

2.3 jQuery não é mais uma dependência padrão

Solicitação de Pull

O jQuery era necessário por padrão nas versões anteriores do Rails para fornecer recursos como data-remote, data-confirm e outras partes do JavaScript não intrusivo do Rails. Não é mais necessário, pois o UJS foi reescrito para usar JavaScript puro. Esse código agora é enviado dentro do Action View como rails-ujs.

Você ainda pode usar o jQuery, se necessário, mas não é mais necessário por padrão.

2.4 Testes de sistema

Solicitação de Pull

O Rails 5.1 possui suporte integrado para escrever testes com Capybara, na forma de testes de sistema. Você não precisa mais se preocupar em configurar o Capybara e as estratégias de limpeza do banco de dados para esses testes. O Rails 5.1 fornece um wrapper para executar testes no Chrome com recursos adicionais, como capturas de tela de falhas.

2.5 Segredos criptografados

Solicitação de Pull

O Rails agora permite o gerenciamento de segredos de aplicativos de forma segura, inspirado na gem sekrets.

Execute bin/rails secrets:setup para configurar um novo arquivo de segredos criptografados. Isso também irá gerar uma chave mestra, que deve ser armazenada fora do repositório. Os segredos em si podem então ser armazenados com segurança no sistema de controle de revisão, em forma criptografada.

Os segredos serão descriptografados em produção, usando uma chave armazenada na variável de ambiente RAILS_MASTER_KEY ou em um arquivo de chave.

2.6 Mailers parametrizados

Solicitação de Pull

Permite especificar parâmetros comuns usados para todos os métodos em uma classe de mailer, a fim de compartilhar variáveis de instância, cabeçalhos e outras configurações comuns.

class InvitationsMailer < ApplicationMailer
  before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
  before_action { @account = params[:inviter].account }

  def account_invitation
    mail subject: "#{@inviter.name} convidou você para o Basecamp deles (#{@account.name})"
  end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
                 .account_invitation.deliver_later

2.7 Rotas diretas e resolvidas

Solicitação de Pull

O Rails 5.1 adiciona dois novos métodos, resolve e direct, à DSL de roteamento. O método resolve permite personalizar o mapeamento polimórfico de modelos. ```ruby recurso :basket

resolve("Basket") { [:basket] } ```

<%= form_for @basket do |form| %>
  <!-- formulário do cesto -->
<% end %>

Isso irá gerar a URL singular /basket em vez da usual /baskets/:id.

O método direct permite a criação de helpers de URL personalizados.

direct(:homepage) { "https://rubyonrails.org" }

homepage_url # => "https://rubyonrails.org"

O valor de retorno do bloco deve ser um argumento válido para o método url_for. Portanto, você pode passar uma URL de string válida, Hash, Array, uma instância de Active Model ou uma classe de Active Model.

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :main do
  { controller: 'pages', action: 'index', subdomain: 'www' }
end

2.8 Unificação de form_for e form_tag em form_with

Pull Request

Antes do Rails 5.1, havia duas interfaces para lidar com formulários HTML: form_for para instâncias de modelos e form_tag para URLs personalizadas.

O Rails 5.1 combina essas duas interfaces com form_with e pode gerar tags de formulário com base em URLs, escopos ou modelos.

Usando apenas uma URL:

<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Irá gerar %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="title">
</form>

Adicionando um escopo, os nomes dos campos de entrada são prefixados:

<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Irá gerar %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

Usando um modelo, o URL e o escopo são inferidos:

<%= form_with model: Post.new do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Irá gerar %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

Um modelo existente cria um formulário de atualização e preenche os valores dos campos:

<%= form_with model: Post.first do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Irá gerar %>

<form action="/posts/1" method="post" data-remote="true">
  <input type="hidden" name="_method" value="patch">
  <input type="text" name="post[title]" value="<o título do post>">
</form>

3 Incompatibilidades

As seguintes alterações podem exigir ação imediata após a atualização.

3.1 Testes transacionais com múltiplas conexões

Os testes transacionais agora envolvem todas as conexões do Active Record em transações de banco de dados.

Quando um teste gera threads adicionais e essas threads obtêm conexões de banco de dados, essas conexões agora são tratadas de forma especial:

As threads compartilharão uma única conexão, que está dentro da transação gerenciada. Isso garante que todas as threads vejam o banco de dados no mesmo estado, ignorando a transação mais externa. Anteriormente, essas conexões adicionais não conseguiam ver as linhas de fixture, por exemplo.

Quando uma thread entra em uma transação aninhada, ela temporariamente obtém o uso exclusivo da conexão, para manter o isolamento.

Se seus testes atualmente dependem de obter uma conexão separada, fora da transação, em uma thread gerada, você precisará mudar para um gerenciamento de conexão mais explícito.

Se seus testes geram threads e essas threads interagem enquanto também usam transações de banco de dados explícitas, essa alteração pode introduzir um deadlock.

A maneira fácil de desativar esse novo comportamento é desabilitar os testes transacionais em qualquer caso de teste que seja afetado.

4 Railties

Consulte o Changelog para obter detalhes das alterações.

4.1 Remoções

  • Remover config.static_cache_control obsoleto. (commit)

  • Remover config.serve_static_files obsoleto. (commit)

  • Remover o arquivo obsoleto rails/rack/debugger. (commit)

  • Remover as tarefas obsoletas: rails:update, rails:template, rails:template:copy, rails:update:configs e rails:update:bin. (commit)

  • Remover a variável de ambiente CONTROLLER obsoleta para a tarefa routes. (commit)

  • Remover a opção -j (--javascript) do comando rails new. (Pull Request)

4.2 Mudanças notáveis

  • Adicionada uma seção compartilhada ao config/secrets.yml que será carregada para todos os ambientes. (commit)

  • O arquivo de configuração config/secrets.yml agora é carregado com todas as chaves como símbolos. (Pull Request)

  • Removido o jquery-rails do stack padrão. O rails-ujs, que é enviado com o Action View, é incluído como adaptador UJS padrão. (Pull Request)

  • Adicionar suporte ao Yarn em novos aplicativos com um binstub do yarn e package.json. (Pull Request)

  • Adicione suporte ao Webpack em novos aplicativos através da opção --webpack, que delegará ao gem rails/webpacker. (Pull Request)

  • Inicialize o repositório Git ao gerar um novo aplicativo, se a opção --skip-git não for fornecida. (Pull Request)

  • Adicione segredos criptografados em config/secrets.yml.enc. (Pull Request)

  • Exiba o nome da classe railtie em rails initializers. (Pull Request)

5 Action Cable

Consulte o Changelog para obter detalhes das alterações.

5.1 Alterações notáveis

  • Adicionado suporte para channel_prefix nos adaptadores Redis e Redis com eventos em cable.yml para evitar colisões de nomes ao usar o mesmo servidor Redis com vários aplicativos. (Pull Request)

  • Adicione o gancho ActiveSupport::Notifications para transmitir dados. (Pull Request)

6 Action Pack

Consulte o Changelog para obter detalhes das alterações.

6.1 Remoções

  • Removido o suporte a argumentos não-chave em #process, #get, #post, #patch, #put, #delete e #head para as classes ActionDispatch::IntegrationTest e ActionController::TestCase. (Commit, Commit)

  • Removido ActionDispatch::Callbacks.to_prepare e ActionDispatch::Callbacks.to_cleanup obsoletos. (Commit)

  • Removidos métodos obsoletos relacionados a filtros de controlador. (Commit)

  • Removido suporte obsoleto para :text e :nothing em render. (Commit, Commit)

  • Removido suporte obsoleto para chamar métodos HashWithIndifferentAccess em ActionController::Parameters. (Commit)

6.2 Descontinuações

  • Descontinuada config.action_controller.raise_on_unfiltered_parameters. Não tem efeito no Rails 5.1. (Commit)

6.3 Alterações notáveis

  • Adicionados os métodos direct e resolve à DSL de roteamento. (Pull Request)

  • Adicionada uma nova classe ActionDispatch::SystemTestCase para escrever testes de sistema em seus aplicativos. (Pull Request)

7 Action View

Consulte o Changelog para obter detalhes das alterações.

7.1 Remoções

  • Removido #original_exception obsoleto em ActionView::Template::Error. (commit)

  • Remova a opção encode_special_chars equivocada de strip_tags. (Pull Request)

7.2 Descontinuações

  • Descontinuado o manipulador Erubis ERB em favor de Erubi. (Pull Request)

7.3 Alterações notáveis

  • O manipulador de modelo bruto (o manipulador de modelo padrão no Rails 5) agora gera strings seguras para HTML. (commit)

  • Altere datetime_field e datetime_field_tag para gerar campos datetime-local. (Pull Request)

  • Nova sintaxe estilo Builder para tags HTML (tag.div, tag.br, etc.). (Pull Request)

  • Adicione form_with para unificar o uso de form_tag e form_for. (Pull Request)

  • Adicione a opção check_parameters para current_page?. (Pull Request)

8 Action Mailer

Consulte o Changelog para obter detalhes das alterações.

8.1 Alterações notáveis

  • Permitido definir um tipo de conteúdo personalizado quando anexos são incluídos e o corpo é definido inline. (Pull Request)

  • Permitido passar lambdas como valores para o método default. (Commit)

  • Adicionado suporte para invocação parametrizada de mailers para compartilhar filtros e padrões entre diferentes ações de mailer. (Commit)

  • Passados os argumentos recebidos para a ação do mailer para o evento process.action_mailer em uma chave args. (Pull Request)

9 Active Record

Consulte o Changelog para obter detalhes das alterações.

9.1 Remoções

  • Removido suporte para passar argumentos e bloco ao mesmo tempo para ActiveRecord::QueryMethods#select. (Commit)

  • Removidos os escopos de internacionalização activerecord.errors.messages.restrict_dependent_destroy.one e activerecord.errors.messages.restrict_dependent_destroy.many que estavam obsoletos. (Commit)

  • Removido o argumento de recarregamento forçado obsoleto nos leitores de associação singular e de coleção. (Commit)

  • Removido o suporte obsoleto para passar uma coluna para #quote. (Commit)

  • Removido o argumento name obsoleto de #tables. (Commit)

  • Removido o comportamento obsoleto de #tables e #table_exists? de retornar apenas tabelas e não visualizações. (Commit)

  • Removido o argumento original_exception obsoleto em ActiveRecord::StatementInvalid#initialize e ActiveRecord::StatementInvalid#original_exception. (Commit)

  • Removido o suporte obsoleto para passar uma classe como valor em uma consulta. (Commit)

  • Removido o suporte obsoleto para consulta usando vírgulas no LIMIT. (Commit)

  • Removido o parâmetro conditions obsoleto de #destroy_all. (Commit)

  • Removido o parâmetro conditions obsoleto de #delete_all. (Commit)

  • Removido o método obsoleto #load_schema_for em favor de #load_schema. (Commit)

  • Removida a configuração obsoleta #raise_in_transactional_callbacks. (Commit)

  • Removida a configuração obsoleta #use_transactional_fixtures. (Commit)

9.2 Obsolescências

  • Obsoleto o sinalizador error_on_ignored_order_or_limit, use error_on_ignored_order em seu lugar. (Commit)

  • Obsoleto sanitize_conditions, use sanitize_sql em seu lugar. (Pull Request)

  • Obsoleto supports_migrations? nos adaptadores de conexão. (Pull Request)

  • Obsoleto Migrator.schema_migrations_table_name, use SchemaMigration.table_name em seu lugar. (Pull Request)

  • Obsoleto o uso de #quoted_id na citação e conversão de tipos. (Pull Request)

  • Depreciado o argumento default ao chamar #index_name_exists?. (Pull Request)

9.3 Mudanças notáveis

  • Alteração das chaves primárias padrão para BIGINT. (Pull Request)

  • Suporte a colunas virtuais/geradas para MySQL 5.7.5+ e MariaDB 5.2.0+. (Commit)

  • Adicionado suporte a limites no processamento em lote. (Commit)

  • Testes transacionais agora envolvem todas as conexões do Active Record em transações de banco de dados. (Pull Request)

  • Comentários são ignorados na saída do comando mysqldump por padrão. (Pull Request)

  • Corrigido ActiveRecord::Relation#count para usar Enumerable#count do Ruby para contar registros quando um bloco é passado como argumento, em vez de ignorar silenciosamente o bloco passado. (Pull Request)

  • Passar a flag "-v ON_ERROR_STOP=1" com o comando psql para não suprimir erros de SQL. (Pull Request)

  • Adicionado ActiveRecord::Base.connection_pool.stat. (Pull Request)

  • Herdar diretamente de ActiveRecord::Migration gera um erro. Especifique a versão do Rails para a qual a migração foi escrita. (Commit)

  • Um erro é gerado quando a associação through tem um nome de reflexão ambíguo. (Commit)

10 Active Model

Consulte o Changelog para obter detalhes das mudanças.

10.1 Remoções

  • Removidos métodos obsoletos em ActiveModel::Errors. (commit)

  • Removida a opção obsoleta :tokenizer no validador de comprimento. (commit)

  • Removido o comportamento obsoleto que interrompe os callbacks quando o valor de retorno é falso. (commit)

10.2 Mudanças notáveis

  • A string original atribuída a um atributo do modelo não é mais congelada incorretamente. (Pull Request)

11 Active Job

Consulte o Changelog para obter detalhes das mudanças.

11.1 Remoções

  • Removido o suporte obsoleto para passar a classe do adaptador para .queue_adapter. (commit)

  • Removido #original_exception obsoleto em ActiveJob::DeserializationError. (commit)

11.2 Mudanças notáveis

  • Adicionado tratamento declarativo de exceções via ActiveJob::Base.retry_on e ActiveJob::Base.discard_on. (Pull Request)

  • Retornar a instância do job para ter acesso a coisas como job.arguments na lógica personalizada após as tentativas de reenvio falharem. (commit)

12 Active Support

Consulte o Changelog para obter detalhes das mudanças.

12.1 Remoções

  • Removida a classe ActiveSupport::Concurrency::Latch. (Commit)

  • Removido halt_callback_chains_on_return_false. (Commit)

  • Removido o comportamento obsoleto que interrompe os callbacks quando o retorno é falso. (Commit)

    Depreciações

  • A classe HashWithIndifferentAccess no nível superior foi suavemente depreciada em favor da classe ActiveSupport::HashWithIndifferentAccess. (Pull Request)

  • Depreciado o uso de string para as opções condicionais :if e :unless nos métodos set_callback e skip_callback. (Commit)

12.2 Mudanças notáveis

  • Corrigida a análise de duração e viagem no tempo para torná-las consistentes durante as mudanças de horário de verão. (Commit, Pull Request)

  • Atualizado o Unicode para a versão 9.0.0. (Pull Request)

  • Adicionados os métodos Duration#before e #after como aliases para #ago e #since. (Pull Request)

  • Adicionado Module#delegate_missing_to para delegar chamadas de método não definidas para o objeto proxy atual. (Pull Request)

  • Adicionado Date#all_day, que retorna um intervalo representando o dia inteiro da data e hora atual. (Pull Request)

  • Introduzidos os métodos assert_changes e assert_no_changes para testes. (Pull Request)

  • Os métodos travel e travel_to agora geram um erro em chamadas aninhadas. (Pull Request)

  • Atualizado DateTime#change para suportar usec e nsec. (Pull Request)

13 Créditos

Veja a lista completa de contribuidores para o Rails para as muitas pessoas que dedicaram muitas horas para tornar o Rails o framework estável e robusto que é. 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.