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
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
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
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
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
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
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
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
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
erails:update:bin
. (commit)Remover a variável de ambiente
CONTROLLER
obsoleta para a tarefaroutes
. (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 emcable.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 classesActionDispatch::IntegrationTest
eActionController::TestCase
. (Commit, Commit)Removido
ActionDispatch::Callbacks.to_prepare
eActionDispatch::Callbacks.to_cleanup
obsoletos. (Commit)Removidos métodos obsoletos relacionados a filtros de controlador. (Commit)
Removido suporte obsoleto para
:text
e:nothing
emrender
. (Commit, Commit)Removido suporte obsoleto para chamar métodos
HashWithIndifferentAccess
emActionController::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
eresolve
à 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 emActionView::Template::Error
. (commit)Remova a opção
encode_special_chars
equivocada destrip_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
edatetime_field_tag
para gerar camposdatetime-local
. (Pull Request)Nova sintaxe estilo Builder para tags HTML (
tag.div
,tag.br
, etc.). (Pull Request)Adicione
form_with
para unificar o uso deform_tag
eform_for
. (Pull Request)Adicione a opção
check_parameters
paracurrent_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 chaveargs
. (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
eactiverecord.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 emActiveRecord::StatementInvalid#initialize
eActiveRecord::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
, useerror_on_ignored_order
em seu lugar. (Commit)Obsoleto
sanitize_conditions
, usesanitize_sql
em seu lugar. (Pull Request)Obsoleto
supports_migrations?
nos adaptadores de conexão. (Pull Request)Obsoleto
Migrator.schema_migrations_table_name
, useSchemaMigration.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 usarEnumerable#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 comandopsql
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 emActiveJob::DeserializationError
. (commit)
11.2 Mudanças notáveis
Adicionado tratamento declarativo de exceções via
ActiveJob::Base.retry_on
eActiveJob::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 classeActiveSupport::HashWithIndifferentAccess
. (Pull Request)Depreciado o uso de string para as opções condicionais
:if
e:unless
nos métodosset_callback
eskip_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
eassert_no_changes
para testes. (Pull Request)Os métodos
travel
etravel_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.