edge
Mais em rubyonrails.org: Mais Ruby on Rails

Ruby on Rails 5.0 Notas de Lançamento

Destaques no Rails 5.0:

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.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 4.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 5.0. Uma lista de coisas para ficar atento ao atualizar está disponível no guia Atualizando o Ruby on Rails.

2 Principais Recursos

2.1 Action Cable

Action Cable é um novo framework no Rails 5. Ele integra perfeitamente WebSockets com o restante do seu aplicativo Rails.

Action Cable permite que recursos em tempo real sejam escritos em Ruby no mesmo estilo e formato do restante do seu aplicativo Rails, ao mesmo tempo em que é performático e escalável. É uma oferta de pilha completa que fornece tanto um framework JavaScript do lado do cliente quanto um framework Ruby do lado do servidor. Você tem acesso ao seu modelo de domínio completo escrito com Active Record ou sua ORM de escolha.

Consulte o guia Visão Geral do Action Cable para obter mais informações.

2.2 Aplicações API

Agora o Rails pode ser usado para criar aplicativos API apenas. Isso é útil para criar e servir APIs simplificadas semelhantes à API do Twitter ou GitHub, que podem ser usadas para servir aplicativos públicos, bem como aplicativos personalizados.

Você pode gerar um novo aplicativo Rails API usando:

$ rails new my_api --api

Isso fará três coisas principais:

  • Configurar sua aplicação para iniciar com um conjunto mais limitado de middlewares do que o normal. Especificamente, não incluirá por padrão nenhum middleware principalmente útil para aplicativos de navegador (como suporte a cookies).
  • Fazer com que ApplicationController herde de ActionController::API em vez de ActionController::Base. Assim como os middlewares, isso deixará de fora quaisquer módulos do Action Controller que forneçam funcionalidades principalmente usadas por aplicativos de navegador.
  • Configurar os geradores para pular a geração de views, helpers e assets ao gerar um novo recurso.

A aplicação fornece uma base para APIs, que podem então ser configuradas para incluir funcionalidades adequadas às necessidades da aplicação.

Consulte o guia Using Rails for API-only Applications para obter mais informações.

2.3 API de atributos do Active Record

Define um atributo com um tipo em um modelo. Ele substituirá o tipo de atributos existentes, se necessário. Isso permite controlar como os valores são convertidos para e de SQL quando atribuídos a um modelo. Também altera o comportamento dos valores passados para ActiveRecord::Base.where, o que permite usar nossos objetos de domínio em grande parte do Active Record, sem precisar depender de detalhes de implementação ou monkey patching.

Algumas coisas que você pode alcançar com isso:

  • O tipo detectado pelo Active Record pode ser substituído.
  • Um valor padrão também pode ser fornecido.
  • Os atributos não precisam ser suportados por uma coluna de banco de dados.
# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')

# antes
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, :integer # tipo personalizado
  attribute :my_string, :string, default: "new default" # valor padrão
  attribute :my_default_proc, :datetime, default: -> { Time.now } # valor padrão
  attribute :field_without_db_column, :integer, array: true
end

# depois
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}

Criando Tipos Personalizados:

Você pode definir seus próprios tipos personalizados, desde que eles respondam aos métodos definidos no tipo de valor. O método deserialize ou cast será chamado no objeto do seu tipo, com a entrada bruta do banco de dados ou dos seus controladores. Isso é útil, por exemplo, ao fazer conversões personalizadas, como dados de dinheiro.

Consultando:

Quando ActiveRecord::Base.where é chamado, ele usará o tipo definido pela classe do modelo para converter o valor em SQL, chamando serialize no objeto do seu tipo.

Isso dá aos objetos a capacidade de especificar como converter valores ao executar consultas SQL.

Rastreamento de Mudanças:

O tipo de um atributo pode alterar como o rastreamento de mudanças é realizado.

Consulte a documentação para obter uma descrição detalhada.

2.4 Test Runner

Um novo test runner foi introduzido para aprimorar as capacidades de execução de testes no Rails. Para usar este test runner, basta digitar bin/rails test.

O Test Runner é inspirado no RSpec, minitest-reporters, maxitest e outros. Ele inclui alguns desses avanços notáveis:

  • Executar um único teste usando o número da linha do teste.
  • Executar vários testes apontando para o número da linha dos testes.
  • Melhoria nas mensagens de falha, que também facilitam a reexecução dos testes falhados.
  • Falhar rapidamente usando a opção -f, para interromper os testes imediatamente ao ocorrer uma falha, em vez de esperar a conclusão da suíte.
  • Adiar a saída dos testes até o final de uma execução completa de testes usando a opção -d.
  • Saída completa do backtrace da exceção usando a opção -b.
  • Integração com o minitest para permitir opções como -s para dados de seed de teste, -n para executar um teste específico pelo nome, -v para uma saída verbose melhorada, entre outras.
  • Saída colorida dos testes.

3 Railties

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

3.1 Remoções

  • Removido suporte ao debugger, use o byebug em vez disso. debugger não é suportado pelo Ruby 2.2. (commit)
  • Removidas as tarefas test:all e test:all:db obsoletas. (commit)

  • Removido o Rails::Rack::LogTailer obsoleto. (commit)

  • Removida a constante RAILS_CACHE obsoleta. (commit)

  • Removida a configuração serve_static_assets obsoleta. (commit)

  • Removidas as tarefas de documentação doc:app, doc:rails e doc:guides. (commit)

  • Removido o middleware Rack::ContentLength da pilha padrão. (Commit)

3.2 Depreciações

  • config.static_cache_control foi depreciado em favor de config.public_file_server.headers. (Pull Request)

  • config.serve_static_files foi depreciado em favor de config.public_file_server.enabled. (Pull Request)

  • As tarefas no namespace rails foram depreciadas em favor do namespace app. (por exemplo, as tarefas rails:update e rails:template foram renomeadas para app:update e app:template.) (Pull Request)

3.3 Mudanças notáveis

  • Adicionado o test runner do Rails bin/rails test. (Pull Request)

  • Aplicações e plugins recém-gerados recebem um README.md em Markdown. (commit, Pull Request)

  • Adicionada a tarefa bin/rails restart para reiniciar sua aplicação Rails tocando em tmp/restart.txt. (Pull Request)

  • Adicionada a tarefa bin/rails initializers para imprimir todos os inicializadores definidos na ordem em que são invocados pelo Rails. (Pull Request)

  • Adicionada a tarefa bin/rails dev:cache para habilitar ou desabilitar o cache no modo de desenvolvimento. (Pull Request)

  • Adicionado o script bin/update para atualizar automaticamente o ambiente de desenvolvimento. (Pull Request)

  • Tarefas Rake são proxy através de bin/rails. (Pull Request, Pull Request)

  • Novas aplicações são geradas com o monitor de sistema de arquivos baseado em eventos habilitado no Linux e macOS. Essa funcionalidade pode ser desativada passando --skip-listen para o gerador. (commit, commit)

  • Gere aplicações com a opção de registrar logs no STDOUT em produção usando a variável de ambiente RAILS_LOG_TO_STDOUT. (Pull Request)

  • HSTS é habilitado com o cabeçalho IncludeSubdomains para novas aplicações. (Pull Request)

  • O gerador de aplicação escreve um novo arquivo config/spring.rb, que informa ao Spring para monitorar arquivos comuns adicionais. (commit)

  • Adicionado --skip-action-mailer para pular o Action Mailer ao gerar uma nova aplicação. (Pull Request)

  • Removido o diretório tmp/sessions e a tarefa rake de limpeza associada a ele. (Pull Request)

  • Alterado o _form.html.erb gerado pelo gerador de scaffold para usar variáveis locais. (Pull Request)

  • Desabilitada a carga automática de classes no ambiente de produção. (commit)

4 Action Pack

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

4.1 Remoções

  • Removido ActionDispatch::Request::Utils.deep_munge. (commit)

  • Removido ActionController::HideActions. (Pull Request)

  • Removidos os métodos de espaço reservado respond_to e respond_with, essa funcionalidade foi extraída para a gem responders. (commit)

  • Removidos os arquivos de asserção obsoletos. (commit)

  • Removido o uso obsoleto de chaves de string nos auxiliares de URL. (commit)

  • Removida a opção obsoleta only_path nos auxiliares *_path. (commit)

  • Removido o suporte obsoleto NamedRouteCollection#helpers. (commit)

  • Removido o suporte obsoleto para definir rotas com a opção :to que não contém #. (commit)

  • Removido ActionDispatch::Response#to_ary obsoleto. (commit)

  • Removido ActionDispatch::Request#deep_munge obsoleto. (commit)

  • Removido ActionDispatch::Http::Parameters#symbolized_path_parameters obsoleto. (commit)

  • Removida a opção obsoleta use_route nos testes de controlador. (commit)

  • Removidos assigns e assert_template. Ambos os métodos foram extraídos para a gem rails-controller-testing. (Pull Request)

4.2 Depreciações

  • Depreciados todos os callbacks *_filter em favor dos callbacks *_action. (Pull Request)

  • Depreciados os métodos de teste de integração *_via_redirect. Use follow_redirect! manualmente após a chamada da requisição para o mesmo comportamento. (Pull Request)

  • Depreciado AbstractController#skip_action_callback em favor de métodos individuais skip_callback. (Pull Request)

  • Depreciada a opção :nothing para o método render. (Pull Request)

  • Depreciado o uso do primeiro parâmetro como Hash e o código de status padrão para o método head. (Pull Request)

  • Depreciado o uso de strings ou símbolos para nomes de classes de middleware. Use nomes de classe em vez disso. (commit)

  • Depreciado o acesso aos tipos de MIME via constantes (por exemplo, Mime::HTML). Use o operador de subscrito com um símbolo em vez disso (por exemplo, Mime[:html]). (Pull Request)

  • Depreciado redirect_to :back em favor de redirect_back, que aceita um argumento fallback_location obrigatório, eliminando assim a possibilidade de um RedirectBackError. (Pull Request)

  • ActionDispatch::IntegrationTest e ActionController::TestCase depreciam argumentos posicionais em favor de argumentos de palavra-chave. (Pull Request)

  • Depreciados os parâmetros de caminho :controller e :action. (Pull Request)

  • Depreciado o método env nas instâncias de controlador. (commit)

  • ActionDispatch::ParamsParser está depreciado e foi removido da pilha de middlewares. Para configurar os analisadores de parâmetros, use ActionDispatch::Request.parameter_parsers=. (commit, commit)

    Mudanças notáveis

  • Adicionado ActionController::Renderer para renderizar templates arbitrários fora das ações do controlador. (Pull Request)

  • Migração para a sintaxe de argumentos de palavra-chave em ActionController::TestCase e métodos de solicitação HTTP de ActionDispatch::Integration. (Pull Request)

  • Adicionado http_cache_forever ao Action Controller, para que possamos armazenar em cache uma resposta que nunca expira. (Pull Request)

  • Fornecer acesso mais amigável às variantes de solicitação. (Pull Request)

  • Para ações sem templates correspondentes, renderizar head :no_content em vez de gerar um erro. (Pull Request)

  • Adicionada a capacidade de substituir o construtor de formulários padrão para um controlador. (Pull Request)

  • Adicionado suporte para aplicativos somente de API. ActionController::API é adicionado como substituto de ActionController::Base para esse tipo de aplicativo. (Pull Request)

  • Tornar ActionController::Parameters não herda mais de HashWithIndifferentAccess. (Pull Request)

  • Tornar mais fácil optar por config.force_ssl e config.ssl_options por tornando-os menos perigosos de tentar e mais fáceis de desativar. (Pull Request)

  • Adicionada a capacidade de retornar cabeçalhos arbitrários para ActionDispatch::Static. (Pull Request)

  • Alterado o padrão de prepend de protect_from_forgery para false. (commit)

  • ActionController::TestCase será movido para sua própria gema no Rails 5.1. Use ActionDispatch::IntegrationTest em seu lugar. (commit)

  • O Rails gera ETags fracos por padrão. (Pull Request)

  • Ações do controlador sem uma chamada render explícita e sem templates correspondentes renderizarão head :no_content implicitamente em vez de gerar um erro. (Pull Request 1, 2)

  • Adicionada uma opção para tokens CSRF por formulário. (Pull Request)

  • Adicionada codificação de solicitação e análise de resposta aos testes de integração. (Pull Request)

  • Adicione ActionController#helpers para obter acesso ao contexto de visualização no nível do controlador. (Pull Request)

  • As mensagens flash descartadas são removidas antes de serem armazenadas na sessão. (Pull Request)

  • Adicionado suporte para passar uma coleção de registros para fresh_when e stale?. (Pull Request)

  • ActionController::Live se tornou um ActiveSupport::Concern. Isso significa que ele não pode ser apenas incluído em outros módulos sem estendê-los com ActiveSupport::Concern ou ActionController::Live não terá efeito em produção. Algumas pessoas podem estar usando outro módulo para incluir algum código especial de tratamento de falha de autenticação Warden/Devise também, já que o middleware não pode capturar um :warden lançado por uma thread gerada, que é o caso ao usar ActionController::Live. (Mais detalhes neste problema)

  • Introduza Response#strong_etag= e #weak_etag= e opções análogas para fresh_when e stale?. (Pull Request)

5 Action View

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

5.1 Remoções

  • Removido AbstractController::Base::parent_prefixes obsoleto. (commit)

  • Removido ActionView::Helpers::RecordTagHelper, essa funcionalidade foi extraída para a gem record_tag_helper. (Pull Request)

  • Removida a opção :rescue_format para o helper translate pois não é mais suportada pelo I18n. (Pull Request)

5.2 Mudanças Notáveis

  • Alterado o manipulador de templates padrão de ERB para Raw. (commit)

  • A renderização de coleções pode armazenar em cache e buscar vários parciais de uma vez. (Pull Request, commit)

  • Adicionada correspondência de curinga para dependências explícitas. (Pull Request)

  • Tornar disable_with o comportamento padrão para tags de envio. Desabilita o botão no envio para evitar envios duplicados. (Pull Request)

  • O nome do template parcial não precisa mais ser um identificador Ruby válido. (commit)

  • O helper datetime_tag agora gera uma tag de input com o tipo datetime-local. (Pull Request)

  • Permite blocos ao renderizar com o helper render partial:. (Pull Request)

6 Action Mailer

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

6.1 Remoções

  • Removidos os helpers *_path obsoletos nas visualizações de e-mail. (commit)

  • Removidos os métodos obsoletos deliver e deliver!. (commit)

6.2 Mudanças Notáveis

  • A busca de templates agora respeita o locale padrão e as fallbacks do I18n. (commit)

  • Adicionado sufixo _mailer aos mailers criados via gerador, seguindo a mesma convenção de nomenclatura usada em controladores e jobs. (Pull Request)

  • Adicionados assert_enqueued_emails e assert_no_enqueued_emails. (Pull Request)

  • Adicionada a configuração config.action_mailer.deliver_later_queue_name para definir o nome da fila do mailer. (Pull Request)

  • Adicionado suporte para cache de fragmentos nas visualizações do Action Mailer. Adicionada nova opção de configuração config.action_mailer.perform_caching para determinar se seus templates devem realizar cache ou não. (Pull Request)

7 Active Record

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

7.1 Remoções

  • Removido o comportamento obsoleto que permitia passar matrizes aninhadas como valores de consulta. (Pull Request)

  • Removido ActiveRecord::Tasks::DatabaseTasks#load_schema obsoleto. Este método foi substituído por ActiveRecord::Tasks::DatabaseTasks#load_schema_for. (commit)

  • Removido serialized_attributes obsoleto. (commit)

  • Removido contador automático obsoleto em has_many :through. (commit)

  • Removido sanitize_sql_hash_for_conditions obsoleto. (commit)

  • Removido Reflection#source_macro obsoleto. (commit)

  • Removido symbolized_base_class e symbolized_sti_name obsoletos. (commit)

  • Removido ActiveRecord::Base.disable_implicit_join_references=. (commit)

  • Removido acesso obsoleto à especificação de conexão usando um acessor de string. (commit)

  • Removido suporte obsoleto para pré-carregar associações dependentes da instância. (commit)

  • Removido suporte obsoleto para intervalos PostgreSQL com limites inferiores exclusivos. (commit)

  • Removida a depreciação ao modificar uma relação com Arel em cache. Agora, isso gera um erro ImmutableRelation. (commit)

  • Removido ActiveRecord::Serialization::XmlSerializer do núcleo. Essa funcionalidade foi extraída para o activemodel-serializers-xml gem. (Pull Request)

  • Removido suporte para o adaptador de banco de dados legado mysql do núcleo. A maioria dos usuários deve ser capaz de usar mysql2. Ele será convertido em um gem separado quando encontrarmos alguém para mantê-lo. (Pull Request 1, Pull Request 2)

  • Removido suporte para o gem protected_attributes. (commit)

  • Removido suporte para versões do PostgreSQL abaixo de 9.1. (Pull Request)

  • Removido suporte para o gem activerecord-deprecated_finders. (commit)

  • Removida a constante ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES. (commit)

7.2 Depreciações

  • Depreciado passar uma classe como valor em uma consulta. Os usuários devem passar strings em vez disso. (Pull Request)

  • Depreciado retornar false como forma de interromper as cadeias de callback do Active Record. A forma recomendada é usar throw(:abort). (Pull Request)

  • Depreciado ActiveRecord::Base.errors_in_transactional_callbacks=. (commit)

  • Depreciado o uso de Relation#uniq, use Relation#distinct em vez disso. (commit)

  • Depreciado o tipo PostgreSQL :point em favor de um novo que retornará objetos Point em vez de um Array (Pull Request)

  • Depreciado recarregar a associação forçadamente passando um argumento verdadeiro para o método de associação. (Pull Request)

  • Depreciadas as chaves para erros de restrict_dependent_destroy da associação em favor de novos nomes de chave. (Pull Request)

  • Sincronizado o comportamento de #tables. (Pull Request)

  • Depreciado SchemaCache#tables, SchemaCache#table_exists? e SchemaCache#clear_table_cache! em favor de seus novos equivalentes de fonte de dados. (Pull Request)

  • connection.tables foi depreciado nos adaptadores SQLite3 e MySQL. (Pull Request)

  • Foi depreciado o envio de argumentos para #tables - o método #tables de alguns adaptadores (mysql2, sqlite3) retornaria tanto tabelas quanto visualizações, enquanto outros (postgresql) retornam apenas tabelas. Para tornar seu comportamento consistente, #tables retornará apenas tabelas no futuro. (Pull Request)

  • Foi depreciado table_exists? - O método #table_exists? verificaria tanto tabelas quanto visualizações. Para tornar seu comportamento consistente com #tables, #table_exists? verificará apenas tabelas no futuro. (Pull Request)

  • Depreciar o envio do argumento offset para find_nth. Por favor, use o método offset na relação em vez disso. (Pull Request)

  • Foi depreciado {insert|update|delete}_sql em DatabaseStatements. Use os métodos públicos {insert|update|delete} em vez disso. (Pull Request)

  • Foi depreciado use_transactional_fixtures em favor de use_transactional_tests para maior clareza. (Pull Request)

  • Foi depreciado o envio de uma coluna para ActiveRecord::Connection#quote. (commit)

  • Adicionada uma opção end para find_in_batches que complementa o parâmetro start para especificar onde parar o processamento em lote. (Pull Request)

7.3 Mudanças notáveis

  • Adicionada a opção foreign_key para references ao criar a tabela. (commit)

  • Nova API de atributos. (commit)

  • Adicionada a opção :_prefix/:_suffix para a definição de enum. (Pull Request, Pull Request)

  • Adicionado #cache_key para ActiveRecord::Relation. (Pull Request)

  • Alterado o valor padrão de null para false em timestamps. (commit)

  • Adicionado ActiveRecord::SecureToken para encapsular a geração de tokens únicos para atributos em um modelo usando SecureRandom. (Pull Request)

  • Adicionada a opção :if_exists para drop_table. (Pull Request)

  • Adicionado ActiveRecord::Base#accessed_fields, que pode ser usado para rapidamente descobrir quais campos foram lidos de um modelo quando você está procurando apenas selecionar os dados necessários do banco de dados. (commit)

  • Adicionado o método #or em ActiveRecord::Relation, permitindo o uso do operador OR para combinar cláusulas WHERE ou HAVING. (commit)

  • Adicionado ActiveRecord::Base.suppress para evitar que o receptor seja salvo durante o bloco fornecido. (Pull Request)

  • belongs_to agora irá disparar um erro de validação por padrão se a associação não estiver presente. Você pode desativar isso em uma base de associação com optional: true. Também foi depreciada a opção required em favor de optional para belongs_to. (Pull Request)

  • Adicionado config.active_record.dump_schemas para configurar o comportamento do db:structure:dump. (Pull Request)

  • Adicionada a opção config.active_record.warn_on_records_fetched_greater_than. (Pull Request)

  • Adicionado suporte nativo ao tipo de dados JSON no MySQL. (Pull Request)

  • Adicionado suporte para exclusão de índices simultaneamente no PostgreSQL. (Pull Request)

  • Adicionados os métodos #views e #view_exists? nos adaptadores de conexão. (Pull Request)

  • Adicionado ActiveRecord::Base.ignored_columns para tornar algumas colunas invisíveis para o Active Record. (Pull Request)

  • Adicionados connection.data_sources e connection.data_source_exists?. Esses métodos determinam quais relações podem ser usadas para dar suporte aos modelos do Active Record (geralmente tabelas e visualizações). (Pull Request)

  • Permite que os arquivos de fixtures definam a classe do modelo no próprio arquivo YAML. (Pull Request)

  • Adicionada a capacidade de definir uuid como chave primária padrão ao gerar migrações de banco de dados. (Pull Request)

  • Adicionados ActiveRecord::Relation#left_joins e ActiveRecord::Relation#left_outer_joins. (Pull Request)

  • Adicionados callbacks after_{create,update,delete}_commit. (Pull Request)

  • Versão da API apresentada para classes de migração, para que possamos alterar os valores padrão dos parâmetros sem quebrar as migrações existentes ou forçá-las a serem reescritas através de um ciclo de depreciação. (Pull Request)

  • ApplicationRecord é uma nova superclasse para todos os modelos do aplicativo, análoga aos controladores do aplicativo que herdam de ApplicationController em vez de ActionController::Base. Isso permite que os aplicativos configurem o comportamento do modelo em todo o aplicativo em um único local. (Pull Request)

  • Adicionados os métodos ActiveRecord#second_to_last e ActiveRecord#third_to_last. (Pull Request)

  • Adicionada a capacidade de adicionar comentários a objetos de banco de dados (tabelas, colunas, índices) armazenados nos metadados do banco de dados para PostgreSQL e MySQL. (Pull Request)

  • Adicionado suporte a prepared statements para o adaptador mysql2, para mysql2 0.4.4+. Anteriormente, isso era suportado apenas no adaptador legado mysql descontinuado. Para habilitar, defina prepared_statements: true em config/database.yml. (Pull Request)

  • Adicionada a capacidade de chamar ActionRecord::Relation#update em objetos de relação, o que executará validações e callbacks em todos os objetos da relação. (Pull Request)

  • Adicionada a opção :touch ao método save, para que os registros possam ser salvos sem atualizar os timestamps. (Pull Request)

  • Adicionado suporte a índices de expressão e classes de operadores para o PostgreSQL. (commit)

  • Adicionada a opção :index_errors para adicionar índices aos erros de atributos aninhados. (Pull Request)

  • Adicionado suporte para dependências destrutivas bidirecionais. (Pull Request)

  • Adicionado suporte para callbacks after_commit em testes transacionais. (Pull Request)

  • Adicionado método foreign_key_exists? para verificar se uma chave estrangeira existe ou não em uma tabela. (Pull Request)

  • Adicionada opção :time para o método touch para atualizar registros com um tempo diferente do tempo atual. (Pull Request)

  • Alterados os callbacks de transação para não ignorar erros. Antes dessa alteração, quaisquer erros gerados dentro de um callback de transação eram resgatados e impressos nos logs, a menos que você usasse a opção (recém-depreciada) raise_in_transactional_callbacks = true.

    Agora esses erros não são mais resgatados e apenas são propagados, seguindo o comportamento de outros callbacks. (commit)

8 Active Model

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

8.1 Remoções

8.2 Depreciações

  • Depreciado o retorno false como forma de interromper as cadeias de callbacks do Active Model e ActiveModel::Validations. A forma recomendada é usar throw(:abort). (Pull Request)

  • Depreciados os métodos ActiveModel::Errors#get, ActiveModel::Errors#set e ActiveModel::Errors#[]= que possuem comportamento inconsistente. (Pull Request)

  • Depreciada a opção :tokenizer para validates_length_of, em favor de Ruby puro. (Pull Request)

  • Depreciados os métodos ActiveModel::Errors#add_on_empty e ActiveModel::Errors#add_on_blank sem substituição. (Pull Request)

8.3 Mudanças notáveis

  • Adicionado o método ActiveModel::Errors#details para determinar qual validador falhou. (Pull Request)

  • Extraído ActiveRecord::AttributeAssignment para ActiveModel::AttributeAssignment, permitindo seu uso em qualquer objeto como um módulo incluível. (Pull Request)

  • Adicionados os métodos ActiveModel::Dirty#[attr_name]_previously_changed? e ActiveModel::Dirty#[attr_name]_previous_change para melhorar o acesso às alterações registradas após o salvamento do modelo. (Pull Request)

  • Validação de múltiplos contextos no valid? e invalid? de uma vez. (Pull Request)

  • Alteração do validates_acceptance_of para aceitar true como valor padrão, além de 1. (Pull Request)

    Active Job

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

8.4 Alterações importantes

  • ActiveJob::Base.deserialize delega para a classe do trabalho. Isso permite que os trabalhos anexem metadados arbitrários quando são serializados e leiam de volta quando são executados. (Pull Request)

  • Adicionada a capacidade de configurar o adaptador de fila em uma base de trabalho sem afetar uns aos outros. (Pull Request)

  • Um trabalho gerado agora herda de app/jobs/application_job.rb por padrão. (Pull Request)

  • Permitir que DelayedJob, Sidekiq, qu, que e queue_classic relatem o ID do trabalho de volta para ActiveJob::Base como provider_job_id. (Pull Request, Pull Request, commit)

  • Implementar um processador de AsyncJob simples e um AsyncAdapter associado que enfileiram trabalhos em uma piscina de threads concurrent-ruby. (Pull Request)

  • Alterar o adaptador padrão de inline para async. É uma melhor opção padrão, pois os testes não dependerão erroneamente de um comportamento ocorrendo de forma síncrona. (commit)

9 Active Support

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

9.1 Remoções

  • Removido ActiveSupport::JSON::Encoding::CircularReferenceError obsoleto. (commit)

  • Removidos os métodos obsoletos ActiveSupport::JSON::Encoding.encode_big_decimal_as_string= e ActiveSupport::JSON::Encoding.encode_big_decimal_as_string. (commit)

  • Removido ActiveSupport::SafeBuffer#prepend obsoleto. (commit)

  • Removidos os métodos obsoletos de Kernel. silence_stderr, silence_stream, capture e quietly. (commit)

  • Removido arquivo obsoleto active_support/core_ext/big_decimal/yaml_conversions. (commit)

  • Removidos os métodos obsoletos ActiveSupport::Cache::Store.instrument e ActiveSupport::Cache::Store.instrument=. (commit)

  • Removido Class#superclass_delegating_accessor obsoleto. Use Class#class_attribute em seu lugar. (Pull Request)

  • Removido ThreadSafe::Cache. Use Concurrent::Map em seu lugar. (Pull Request)

  • Removido Object#itself pois está implementado no Ruby 2.2. (Pull Request)

9.2 Depreciações

  • Depreciado MissingSourceFile em favor de LoadError. (commit)

  • Depreciado alias_method_chain em favor de Module#prepend introduzido em Ruby 2.0. (Pull Request)

  • Depreciado ActiveSupport::Concurrency::Latch em favor de Concurrent::CountDownLatch do concurrent-ruby. (Pull Request)

  • Depreciado a opção :prefix de number_to_human_size sem substituição. (Pull Request)

  • Depreciado Module#qualified_const_ em favor dos métodos Module#const_ incorporados. (Pull Request)

  • Depreciado passar uma string para definir um callback. (Pull Request)

  • Depreciados ActiveSupport::Cache::Store#namespaced_key, ActiveSupport::Cache::MemCachedStore#escape_key e ActiveSupport::Cache::FileStore#key_file_path. Use normalize_key em seu lugar. (Pull Request, commit)

  • Depreciado ActiveSupport::Cache::LocaleCache#set_cache_value em favor de write_cache_value. (Pull Request)

  • Depreciado passar argumentos para assert_nothing_raised. (Pull Request)

  • Depreciado Module.local_constants em favor de Module.constants(false). (Pull Request)

9.3 Mudanças notáveis

  • Adicionados métodos #verified e #valid_message? para ActiveSupport::MessageVerifier. (Pull Request)

  • Alterada a forma como as cadeias de chamadas de retorno podem ser interrompidas. O método preferido para interromper uma cadeia de chamadas de retorno a partir de agora é usar explicitamente throw(:abort). (Pull Request)

  • Nova opção de configuração config.active_support.halt_callback_chains_on_return_false para especificar se as cadeias de chamadas de retorno do ActiveRecord, ActiveModel e ActiveModel::Validations podem ser interrompidas retornando false em um callback 'before'. (Pull Request)

  • Alterada a ordem padrão dos testes de :sorted para :random. (commit)

  • Adicionados métodos #on_weekend?, #on_weekday?, #next_weekday, #prev_weekday para Date, Time e DateTime. (Pull Request, Pull Request)

  • Adicionada opção same_time para #next_week e #prev_week para Date, Time, e DateTime. (Pull Request)

  • Adicionados métodos #prev_day e #next_day como contrapartes de #yesterday e #tomorrow para Date, Time e DateTime. (Pull Request)

  • Adicionado SecureRandom.base58 para geração de strings aleatórias em base58. (commit)

  • Adicionado file_fixture para ActiveSupport::TestCase. Fornece um mecanismo simples para acessar arquivos de exemplo em seus casos de teste. (Pull Request)

  • Adicionado #without em Enumerable e Array para retornar uma cópia de um enumerável sem os elementos especificados. (Pull Request)

  • Adicionados ActiveSupport::ArrayInquirer e Array#inquiry. (Pull Request)

  • Adicionado ActiveSupport::TimeZone#strptime para permitir a análise de horários como se fossem de um determinado fuso horário. (commit)

  • Adicionados métodos de consulta Integer#positive? e Integer#negative? no estilo de Integer#zero?. (commit)

  • Adicionada uma versão com exclamação para os métodos de obtenção de ActiveSupport::OrderedOptions que lançará um KeyError se o valor for .blank?. (Pull Request)

  • Adicionado Time.days_in_year para retornar o número de dias no ano fornecido, ou o ano atual se nenhum argumento for fornecido. (commit)

  • Adicionado um observador de arquivos com eventos para detectar assincronamente alterações no código-fonte da aplicação, rotas, localidades, etc. (Pull Request)

  • Adicionados métodos thread_m/cattr_accessor/reader/writer para declarar variáveis de classe e módulo que vivem por thread. (Pull Request)

  • Adicionados os métodos Array#second_to_last e Array#third_to_last. (Pull Request)

  • Publicadas as APIs ActiveSupport::Executor e ActiveSupport::Reloader para permitir que componentes e bibliotecas gerenciem e participem da execução do código da aplicação e do processo de recarregamento da aplicação. (Pull Request)

  • ActiveSupport::Duration agora suporta formatação e análise ISO8601. (Pull Request)

  • ActiveSupport::JSON.decode agora suporta a análise de horários locais ISO8601 quando parse_json_times está habilitado. (Pull Request)

  • ActiveSupport::JSON.decode agora retorna objetos Date para strings de data. (Pull Request)

  • Adicionada a capacidade de TaggedLogging permitir que os loggers sejam instanciados várias vezes para que eles não compartilhem tags entre si. (Pull Request)

10 Créditos

Veja a lista completa de contribuidores para o Rails para 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.