Ruby on Rails: v6.0.0.beta1 Release

Release date:
July 12, 2022
Previous version:
v5.2.8.1 (released July 12, 2022)
Magnitude:
2,419 Diff Delta
Contributors:
20 total committers
Data confidence:
Commits:

346 Features Released with v6.0.0.beta1

Top Contributors in v6.0.0.beta1

tenderlove
kamipo
rafaelfranca
fresh-eggs
eileencodes
georgeclaghorn
gmcgibbon
genezys
jonathanhefner
dylanahsmith

Directory Browser for v6.0.0.beta1

We haven't yet finished calculating and confirming the files and directories changed in this release. Please check back soon.

Release Notes Published

Active Support

  • Remove deprecated Module#reachable? method.

    Rafael Mendonça França

  • Remove deprecated #acronym_regex method from Inflections.

    Rafael Mendonça França

  • Fix String#safe_constantize throwing a LoadError for incorrectly cased constant references.

    Keenan Brock

  • Preserve key order passed to ActiveSupport::CacheStore#fetch_multi.

    fetch_multi(*names) now returns its results in the same order as the *names requested, rather than returning cache hits followed by cache misses.

    Gannon McGibbon

  • If the same block is included multiple times for a Concern, an exception is no longer raised.

    Mark J. Titorenko, Vlad Bokov

  • Fix bug where #to_options for ActiveSupport::HashWithIndifferentAccess would not act as alias for #symbolize_keys.

    Nick Weiland

  • Improve the logic that detects non-autoloaded constants.

    Jan Habermann, Xavier Noria

  • Deprecate ActiveSupport::Multibyte::Unicode#pack_graphemes(array) and ActiveSuppport::Multibyte::Unicode#unpack_graphemes(string) in favor of array.flatten.pack("U*") and string.scan(/\X/).map(&:codepoints), respectively.

    Francesco Rodríguez

  • Deprecate ActiveSupport::Multibyte::Chars.consumes? in favor of String#is_utf8?.

    Francesco Rodríguez

  • Fix duration being rounded to a full second. time = DateTime.parse("2018-1-1") time += 0.51.seconds Will now correctly add 0.51 second and not 1 full second.

    Edouard Chin

  • Deprecate ActiveSupport::Multibyte::Unicode#normalize and ActiveSuppport::Multibyte::Chars#normalize in favor of String#unicode_normalize

    Francesco Rodríguez

  • Deprecate ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase in favor of String#downcase/upcase/swapcase.

    Francesco Rodríguez

  • Add ActiveSupport::ParameterFilter.

    Yoshiyuki Kinjo

  • Rename Module#parent, Module#parents, and Module#parent_name to module_parent, module_parents, and module_parent_name.

    Gannon McGibbon

  • Deprecate the use of LoggerSilence in favor of ActiveSupport::LoggerSilence

    Edouard Chin

  • Deprecate using negative limits in String#first and String#last.

    Gannon McGibbon, Eric Turner

  • Fix bug where #without for ActiveSupport::HashWithIndifferentAccess would fail with symbol arguments

    Abraham Chan

  • Treat #delete_prefix, #delete_suffix and #unicode_normalize results as non-html_safe. Ensure safety of arguments for #insert, #[]= and #replace calls on html_safe Strings.

    Janosch Müller

  • Changed ActiveSupport::TaggedLogging.new to return a new logger instance instead of mutating the one received as parameter.

    Thierry Joyal

  • Define unfreeze_time as an alias of travel_back in ActiveSupport::Testing::TimeHelpers.

    The alias is provided for symmetry with freeze_time.

    Ryan Davidson

  • Add support for tracing constant autoloads. Just throw

    ActiveSupport::Dependencies.logger = Rails.logger
    ActiveSupport::Dependencies.verbose = true
    

    in an initializer.

    Xavier Noria

  • Maintain html_safe? on html_safe strings when sliced.

    string = "<div>test</div>".html_safe
    string[-1..1].html_safe? # => true
    

    Elom Gomez, Yumin Wong

  • Add Array#extract!.

    The method removes and returns the elements for which the block returns a true value. If no block is given, an Enumerator is returned instead.

    numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
    numbers # => [0, 2, 4, 6, 8]
    

    bogdanvlviv

  • Support not to cache nil for ActiveSupport::Cache#fetch.

    cache.fetch('bar', skip_nil: true) { nil }
    cache.exist?('bar') # => false
    

    Martin Hong

  • Add "event object" support to the notification system. Before this change, end users were forced to create hand made artisanal event objects on their own, like this:

    ActiveSupport::Notifications.subscribe('wait') do |*args|
      @event = ActiveSupport::Notifications::Event.new(*args)
    end
    
    ActiveSupport::Notifications.instrument('wait') do
      sleep 1
    end
    
    @event.duration # => 1000.138
    

    After this change, if the block passed to subscribe only takes one parameter, the framework will yield an event object to the block. Now end users are no longer required to make their own:

    ActiveSupport::Notifications.subscribe('wait') do |event|
      @event = event
    end
    
    ActiveSupport::Notifications.instrument('wait') do
      sleep 1
    end
    
    p @event.allocations # => 7
    p @event.cpu_time    # => 0.256
    p @event.idle_time   # => 1003.2399
    

    Now you can enjoy event objects without making them yourself. Neat!

    Aaron "t.lo" Patterson

  • Add cpu_time, idle_time, and allocations to Event.

    Eileen M. Uchitelle, Aaron Patterson

  • RedisCacheStore: support key expiry in increment/decrement.

    Pass :expires_in to #increment and #decrement to set a Redis EXPIRE on the key.

    If the key is already set to expire, RedisCacheStore won't extend its expiry.

    Rails.cache.increment("some_key", 1, expires_in: 2.minutes)
    

    Jason Lee

  • Allow Range#=== and Range#cover? on Range.

    Range#cover? can now accept a range argument like Range#include? and Range#===. Range#=== works correctly on Ruby 2.6. Range#include? is moved into a new file, with these two methods.

    Requiring active_support/core_ext/range/include_range is now deprecated. Use require "active_support/core_ext/range/compare_range" instead.

    utilum

  • Add index_with to Enumerable.

    Allows creating a hash from an enumerable with the value from a passed block or a default argument.

    %i( title body ).index_with { |attr| post.public_send(attr) }
    # => { title: "hey", body: "what's up?" }
    
    %i( title body ).index_with(nil)
    # => { title: nil, body: nil }
    

    Closely linked with index_by, which creates a hash where the keys are extracted from a block.

    Kasper Timm Hansen

  • Fix bug where ActiveSupport::Timezone.all would fail when tzinfo data for any timezone defined in ActiveSupport::TimeZone::MAPPING is missing.

    Dominik Sander

  • Redis cache store: delete_matched no longer blocks the Redis server. (Switches from evaled Lua to a batched SCAN + DEL loop.)

    Gleb Mazovetskiy

  • Fix bug where ActiveSupport::Cache will massively inflate the storage size when compression is enabled (which is true by default). This patch does not attempt to repair existing data: please manually flush the cache to clear out the problematic entries.

    Godfrey Chan

  • Fix bug where URI.unescape would fail with mixed Unicode/escaped character input:

    URI.unescape("\xe3\x83\x90")  # => "バ"
    URI.unescape("%E3%83%90")  # => "バ"
    URI.unescape("\xe3\x83\x90%E3%83%90")  # => Encoding::CompatibilityError
    

    Ashe Connor, Aaron Patterson

  • Add before? and after? methods to Date, DateTime, Time, and TimeWithZone.

    Nick Holden

  • ActiveSupport::Inflector#ordinal and ActiveSupport::Inflector#ordinalize now support translations through I18n.

    # locale/fr.rb
    
    {
      fr: {
        number: {
          nth: {
            ordinals: lambda do |_key, number:, **_options|
              if number.to_i.abs == 1
                'er'
              else
                'e'
              end
            end,
    
            ordinalized: lambda do |_key, number:, **_options|
              "#{number}#{ActiveSupport::Inflector.ordinal(number)}"
            end
          }
        }
      }
    }
    

    Christian Blais

  • Add :private option to ActiveSupport's Module#delegate in order to delegate methods as private:

    class User < ActiveRecord::Base
      has_one :profile
      delegate :date_of_birth, to: :profile, private: true
    
      def age
        Date.today.year - date_of_birth.year
      end
    end
    
    # User.new.age  # => 29
    # User.new.date_of_birth
    # => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
    

    Tomas Valent

  • String#truncate_bytes to truncate a string to a maximum bytesize without breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦.

    Jeremy Daer

  • String#strip_heredoc preserves frozenness.

    "foo".freeze.strip_heredoc.frozen?  # => true
    

    Fixes that frozen string literals would inadvertently become unfrozen:

    # frozen_string_literal: true
    
    foo = <<-MSG.strip_heredoc
      la la la
    MSG
    
    foo.frozen?  # => false !??
    

    Jeremy Daer

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

  • Adds parallel testing to Rails.

    Parallelize your test suite with forked processes or threads.

    Eileen M. Uchitelle, Aaron Patterson

Active Model

  • Add ActiveModel::Errors#of_kind?.

    bogdanvlviv, Rafael Mendonça França

  • Fix numericality equality validation of BigDecimal and Float by casting to BigDecimal on both ends of the validation.

    Gannon McGibbon

  • Add #slice! method to ActiveModel::Errors.

    Daniel López Prat

  • Fix numericality validator to still use value before type cast except Active Record.

    Fixes #33651, #33686.

    Ryuta Kamizono

  • Fix ActiveModel::Serializers::JSON#as_json method for timestamps.

    Before: contact = Contact.new(created_at: Time.utc(2006, 8, 1)) contact.as_json["created_at"] # => 2006-08-01 00:00:00 UTC

    After: contact = Contact.new(created_at: Time.utc(2006, 8, 1)) contact.as_json["created_at"] # => "2006-08-01T00:00:00.000Z"

    Bogdan Gusiev

  • Allows configurable attribute name for #has_secure_password. This still defaults to an attribute named 'password', causing no breaking change. There is a new method #authenticate_XXX where XXX is the configured attribute name, making the existing #authenticate now an alias for this when the attribute is the default 'password'.

    Example:

    class User < ActiveRecord::Base
      has_secure_password :recovery_password, validations: false
    end
    
    user = User.new()
    user.recovery_password = "42password"
    user.recovery_password_digest # => "$2a$04$iOfhwahFymCs5weB3BNH/uX..."
    user.authenticate_recovery_password('42password') # => user
    

    Unathi Chonco

  • Add config.active_model.i18n_full_message in order to control whether the full_message error format can be overridden at the attribute or model level in the locale files. This is false by default.

    Martin Larochelle

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Active Record

  • Remove deprecated #set_state from the transaction object.

    Rafael Mendonça França

  • Remove deprecated #supports_statement_cache? from the database adapters.

    Rafael Mendonça França

  • Remove deprecated #insert_fixtures from the database adapters.

    Rafael Mendonça França

  • Remove deprecated ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?.

    Rafael Mendonça França

  • Do not allow passing the column name to sum when a block is passed.

    Rafael Mendonça França

  • Do not allow passing the column name to count when a block is passed.

    Rafael Mendonça França

  • Remove delegation of missing methods in a relation to arel.

    Rafael Mendonça França

  • Remove delegation of missing methods in a relation to private methods of the class.

    Rafael Mendonça França

  • Deprecate config.activerecord.sqlite3.represent_boolean_as_integer.

    Rafael Mendonça França

  • Change SQLite3Adapter to always represent boolean values as integers.

    Rafael Mendonça França

  • Remove ability to specify a timestamp name for #cache_key.

    Rafael Mendonça França

  • Remove deprecated ActiveRecord::Migrator.migrations_path=.

    Rafael Mendonça França

  • Remove deprecated expand_hash_conditions_for_aggregates.

    Rafael Mendonça França

  • Set polymorphic type column to NULL on dependent: :nullify strategy.

    On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.

    Laerti Papa

  • Allow permitted instance of ActionController::Parameters as argument of ActiveRecord::Relation#exists?.

    Gannon McGibbon

  • Add support for endless ranges introduces in Ruby 2.6.

    Greg Navis

  • Deprecate passing migrations_paths to connection.assume_migrated_upto_version.

    Ryuta Kamizono

  • MySQL: ROW_FORMAT=DYNAMIC create table option by default.

    Since MySQL 5.7.9, the innodb_default_row_format option defines the default row format for InnoDB tables. The default setting is DYNAMIC. The row format is required for indexing on varchar(255) with utf8mb4 columns.

    Ryuta Kamizono

  • Fix join table column quoting with SQLite.

    Gannon McGibbon

  • Allow disabling scopes generated by ActiveRecord.enum.

    Alfred Dominic

  • Ensure that delete_all on collection proxy returns affected count.

    Ryuta Kamizono

  • Reset scope after delete on collection association to clear stale offsets of removed records.

    Gannon McGibbon

  • Add the ability to prevent writes to a database for the duration of a block.

    Allows the application to prevent writes to a database. This can be useful when you're building out multiple databases and want to make sure you're not sending writes when you want a read.

    If while_preventing_writes is called and the query is considered a write query the database will raise an exception regardless of whether the database user is able to write.

    This is not meant to be a catch-all for write queries but rather a way to enforce read-only queries without opening a second connection. One purpose of this is to catch accidental writes, not all writes.

    Eileen M. Uchitelle

  • Allow aliased attributes to be used in #update_columns and #update.

    Gannon McGibbon

  • Allow spaces in postgres table names.

    Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.

    Gannon McGibbon

  • Cached columns_hash fields should be excluded from ResultSet#column_types

    PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test was passing for SQLite and MySQL, but failed for PostgreSQL:

    class DeveloperName < ActiveRecord::Type::String
      def deserialize(value)
        "Developer: #{value}"
      end
    end
    
    class AttributedDeveloper < ActiveRecord::Base
      self.table_name = "developers"
    
      attribute :name, DeveloperName.new
    
      self.ignored_columns += ["name"]
    end
    
    developer = AttributedDeveloper.create
    developer.update_column :name, "name"
    
    loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
    puts loaded_developer.name # should be "Developer: name" but it's just "name"
    

    Dmitry Tsepelev

  • Make the implicit order column configurable.

    When calling ordered finder methods such as +first+ or +last+ without an explicit order clause, ActiveRecord sorts records by primary key. This can result in unpredictable and surprising behaviour when the primary key is not an auto-incrementing integer, for example when it's a UUID. This change makes it possible to override the column used for implicit ordering such that +first+ and +last+ will return more predictable results.

    Example:

    class Project < ActiveRecord::Base
      self.implicit_order_column = "created_at"
    end
    

    Tekin Suleyman

  • Bump minimum PostgreSQL version to 9.3.

    Yasuo Honda

  • Values of enum are frozen, raising an error when attempting to modify them.

    Emmanuel Byrd

  • Move ActiveRecord::StatementInvalid SQL to error property and include binds as separate error property.

    ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class now requires binds to be passed as the last argument.

    ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception now requires message, sql, and binds to be passed as keyword arguments.

    Subclasses of ActiveRecord::StatementInvalid must now provide sql: and binds: arguments to super.

    Example:

    class MySubclassedError < ActiveRecord::StatementInvalid
      def initialize(message, sql:, binds:)
        super(message, sql: sql, binds: binds)
      end
    end
    

    Gannon McGibbon

  • Add an :if_not_exists option to create_table.

    Example:

    create_table :posts, if_not_exists: true do |t|
      t.string :title
    end
    

    That would execute:

    CREATE TABLE IF NOT EXISTS posts (
      ...
    )
    

    If the table already exists, if_not_exists: false (the default) raises an exception whereas if_not_exists: true does nothing.

    fatkodima, Stefan Kanev

  • Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an ArgumentError.

    Christophe Maximin

  • Adds support for multiple databases to rails db:schema:cache:dump and rails db:schema:cache:clear.

    Gannon McGibbon

  • update_columns now correctly raises ActiveModel::MissingAttributeError if the attribute does not exist.

    Sean Griffin

  • Add support for hash and url configs in database hash of ActiveRecord::Base.connected_to.

    User.connected_to(database: { writing: "postgres://foo" }) do
      User.create!(name: "Gannon")
    end
    
    config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
    User.connected_to(database: { reading: config }) do
      User.count
    end
    

    Gannon McGibbon

  • Support default expression for MySQL.

    MySQL 8.0.13 and higher supports default value to be a function or expression.

    https://dev.mysql.com/doc/refman/8.0/en/create-table.html

    Ryuta Kamizono

  • Support expression indexes for MySQL.

    MySQL 8.0.13 and higher supports functional key parts that index expression values rather than column or column prefix values.

    https://dev.mysql.com/doc/refman/8.0/en/create-index.html

    Ryuta Kamizono

  • Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.

    Fixes #33056.

    Federico Martinez

  • Add basic API for connection switching to support multiple databases.

    1) Adds a connects_to method for models to connect to multiple databases. Example:

    class AnimalsModel < ApplicationRecord
      self.abstract_class = true
    
      connects_to database: { writing: :animals_primary, reading: :animals_replica }
    end
    
    class Dog < AnimalsModel
      # connected to both the animals_primary db for writing and the animals_replica for reading
    end
    

    2) Adds a connected_to block method for switching connection roles or connecting to a database that the model didn't connect to. Connecting to the database in this block is useful when you have another defined connection, for example slow_replica that you don't want to connect to by default but need in the console, or a specific code block.

    ActiveRecord::Base.connected_to(role: :reading) do
      Dog.first # finds dog from replica connected to AnimalsBase
      Book.first # doesn't have a reading connection, will raise an error
    end
    
    ActiveRecord::Base.connected_to(database: :slow_replica) do
      SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
    end
    

    Eileen M. Uchitelle

  • Enum raises on invalid definition values

    When defining a Hash enum it can be easy to use [] instead of {}. This commit checks that only valid definition values are provided, those can be a Hash, an array of Symbols or an array of Strings. Otherwise it raises an ArgumentError.

    Fixes #33961

    Alberto Almagro

  • Reloading associations now clears the Query Cache like Persistence#reload does.

    class Post < ActiveRecord::Base
      has_one :category
      belongs_to :author
      has_many :comments
    end
    
    # Each of the following will now clear the query cache.
    post.reload_category
    post.reload_author
    post.comments.reload
    

    Christophe Maximin

  • Added index option for change_table migration helpers. With this change you can create indexes while adding new columns into the existing tables.

    Example:

    change_table(:languages) do |t|
      t.string :country_code, index: true
    end
    

    Mehmet Emin İNAÇ

  • Fix transaction reverting for migrations.

    Before: Commands inside a transaction in a reverted migration ran uninverted. Now: This change fixes that by reverting commands inside transaction block.

    fatkodima, David Verhasselt

  • Raise an error instead of scanning the filesystem root when fixture_path is blank.

    Gannon McGibbon, Max Albrecht

  • Allow ActiveRecord::Base.configurations= to be set with a symbolized hash.

    Gannon McGibbon

  • Don't update counter cache unless the record is actually saved.

    Fixes #31493, #33113, #33117.

    Ryuta Kamizono

  • Deprecate ActiveRecord::Result#to_hash in favor of ActiveRecord::Result#to_a.

    Gannon McGibbon, Kevin Cheng

  • SQLite3 adapter supports expression indexes.

    create_table :users do |t|
      t.string :email
    end
    
    add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
    

    Gray Kemmey

  • Allow subclasses to redefine autosave callbacks for associated records.

    Fixes #33305.

    Andrey Subbota

  • Bump minimum MySQL version to 5.5.8.

    Yasuo Honda

  • Use MySQL utf8mb4 character set by default.

    utf8mb4 character set with 4-Byte encoding supports supplementary characters including emoji. The previous default 3-Byte encoding character set utf8 is not enough to support them.

    Yasuo Honda

  • Fix duplicated record creation when using nested attributes with create_with.

    Darwin Wu

  • Configuration item config.filter_parameters could also filter out sensitive values of database columns when call #inspect. We also added ActiveRecord::Base::filter_attributes/= in order to specify sensitive attributes to specific model.

    Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
    Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
    SecureAccount.filter_attributes += [:name]
    SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
    

    Zhang Kang, Yoshiyuki Kinjo

  • Deprecate column_name_length, table_name_length, columns_per_table, indexes_per_table, columns_per_multicolumn_index, sql_query_length, and joins_per_query methods in DatabaseLimits.

    Ryuta Kamizono

  • ActiveRecord::Base.configurations now returns an object.

    ActiveRecord::Base.configurations used to return a hash, but this is an inflexible data model. In order to improve multiple-database handling in Rails, we've changed this to return an object. Some methods are provided to make the object behave hash-like in order to ease the transition process. Since most applications don't manipulate the hash we've decided to add backwards-compatible functionality that will throw a deprecation warning if used, however calling ActiveRecord::Base.configurations will use the new version internally and externally.

    For example, the following database.yml:

    development:
      adapter: sqlite3
      database: db/development.sqlite3
    

    Used to become a hash:

    { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
    

    Is now converted into the following object:

    #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
      #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
        @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
      ]
    

    Iterating over the database configurations has also changed. Instead of calling hash methods on the configurations hash directly, a new method configs_for has been provided that allows you to select the correct configuration. env_name, and spec_name arguments are optional. For example these return an array of database config objects for the requested environment and a single database config object will be returned for the requested environment and specification name respectively.

    ActiveRecord::Base.configurations.configs_for(env_name: "development")
    ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
    

    Eileen M. Uchitelle, Aaron Patterson

  • Add database configuration to disable advisory locks.

    production:
      adapter: postgresql
      advisory_locks: false
    

    Guo Xiang

  • SQLite3 adapter alter_table method restores foreign keys.

    Yasuo Honda

  • Allow :to_table option to invert_remove_foreign_key.

    Example:

    remove_foreign_key :accounts, to_table: :owners

    Nikolay Epifanov, Rich Chen

  • Add environment & load_config dependency to bin/rake db:seed to enable seed load in environments without Rails and custom DB configuration

    Tobias Bielohlawek

  • Fix default value for mysql time types with specified precision.

    Nikolay Kondratyev

  • Fix touch option to behave consistently with Persistence#touch method.

    Ryuta Kamizono

  • Migrations raise when duplicate column definition.

    Fixes #33024.

    Federico Martinez

  • Bump minimum SQLite version to 3.8

    Yasuo Honda

  • Fix parent record should not get saved with duplicate children records.

    Fixes #32940.

    Santosh Wadghule

  • Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.

    Brian Durand

  • Ensure Associations::CollectionAssociation#size and Associations::CollectionAssociation#empty? use loaded association ids if present.

    Graham Turner

  • Add support to preload associations of polymorphic associations when not all the records have the requested associations.

    Dana Sherson

  • Add touch_all method to ActiveRecord::Relation.

    Example:

    Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
    

    fatkodima, duggiefresh

  • Add ActiveRecord::Base.base_class? predicate.

    Bogdan Gusiev

  • Add custom prefix/suffix options to ActiveRecord::Store.store_accessor.

    Tan Huynh, Yukio Mizuta

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

  • Deprecate update_attributes/! in favor of update/!.

    Eddie Lebow

  • Add ActiveRecord::Base.create_or_find_by/! to deal with the SELECT/INSERT race condition in ActiveRecord::Base.find_or_create_by/! by leaning on unique constraints in the database.

    DHH

  • Add Relation#pick as short-hand for single-value plucks.

    DHH

Action View

  • Remove deprecated image_alt helper.

    Rafael Mendonça França

  • Fix the need of #protect_against_forgery? method defined in ActionView::Base subclasses. This prevents the use of forms and buttons.

    Genadi Samokovarov

  • Fix UJS permanently showing disabled text in a[data-remote][data-disable-with] elements within forms. Fixes #33889

    Wolfgang Hobmaier

  • Prevent non-primary mouse keys from triggering Rails UJS click handlers. Firefox fires click events even if the click was triggered by non-primary mouse keys such as right- or scroll-wheel-clicks. For example, right-clicking a link such as the one described below (with an underlying ajax request registered on click) should not cause that request to occur.

    <%= link_to 'Remote', remote_path, class: 'remote', remote: true, data: { type: :json } %>
    

    Fixes #34541

    Wolfgang Hobmaier

  • Prevent ActionView::TextHelper#word_wrap from unexpectedly stripping white space from the left side of lines.

    For example, given input like this:

        This is a paragraph with an initial indent,
    followed by additional lines that are not indented,
    and finally terminated with a blockquote:
      "A pithy saying"
    

    Calling word_wrap should not trim the indents on the first and last lines.

    Fixes #34487

    Lyle Mullican

  • Add allocations to template rendering instrumentation.

    Adds the allocations for template and partial rendering to the server output on render.

      Rendered posts/_form.html.erb (Duration: 7.1ms | Allocations: 6004)
      Rendered posts/new.html.erb within layouts/application (Duration: 8.3ms | Allocations: 6654)
    Completed 200 OK in 858ms (Views: 848.4ms | ActiveRecord: 0.4ms | Allocations: 1539564)
    

    Eileen M. Uchitelle, Aaron Patterson

  • Respect the only_path option passed to url_for when the options are passed in as an array

    Fixes #33237.

    Joel Ambass

  • Deprecate calling private model methods from view helpers.

    For example, in methods like options_from_collection_for_select and collection_select it is possible to call private methods from the objects used.

    Fixes #33546.

    Ana María Martínez Gómez

  • Fix issue with button_to's to_form_params

    button_to was throwing exception when invoked with params hash that contains symbol and string keys. The reason for the exception was that to_form_params was comparing the given symbol and string keys.

    The issue is fixed by turning all keys to strings inside to_form_params before comparing them.

    Georgi Georgiev

  • Mark arrays of translations as trusted safe by using the _html suffix.

    Example:

    en:
      foo_html:
        - "One"
        - "<strong>Two</strong>"
        - "Three &#128075; &#128578;"
    

    Juan Broullon

  • Add year_format option to date_select tag. This option makes it possible to customize year names. Lambda should be passed to use this option.

    Example:

    date_select('user_birthday', '', start_year: 1998, end_year: 2000, year_format: ->year { "Heisei #{year - 1988}" })
    

    The HTML produced:

    <select id="user_birthday__1i" name="user_birthday[(1i)]">
    <option value="1998">Heisei 10</option>
    <option value="1999">Heisei 11</option>
    <option value="2000">Heisei 12</option>
    </select>
    /* The rest is omitted */
    

    Koki Ryu

  • Fix JavaScript views rendering does not work with Firefox when using Content Security Policy.

    Fixes #32577.

    Yuji Yaginuma

  • Add the nonce: true option for javascript_include_tag helper to support automatic nonce generation for Content Security Policy. Works the same way as javascript_tag nonce: true does.

    Yaroslav Markin

  • Remove ActionView::Helpers::RecordTagHelper.

    Yoshiyuki Hirano

  • Disable ActionView::Template finalizers in test environment.

    Template finalization can be expensive in large view test suites. Add a configuration option, action_view.finalize_compiled_template_methods, and turn it off in the test environment.

    Simon Coffey

  • Extract the confirm call in its own, overridable method in rails_ujs.

    Example:

    Rails.confirm = function(message, element) {
      return (my_bootstrap_modal_confirm(message));
    }
    

    Mathieu Mahé

  • Enable select tag helper to mark prompt option as selected and/or disabled for required field.

    Example:

    select :post,
           :category,
           ["lifestyle", "programming", "spiritual"],
           { selected: "", disabled: "", prompt: "Choose one" },
           { required: true }
    

    Placeholder option would be selected and disabled.

    The HTML produced:

    <select required="required" name="post[category]" id="post_category">
    <option disabled="disabled" selected="selected" value="">Choose one</option>
    <option value="lifestyle">lifestyle</option>
    <option value="programming">programming</option>
    <option value="spiritual">spiritual</option></select>
    

    Sergey Prikhodko

  • Don't enforce UTF-8 by default.

    With the disabling of TLS 1.0 by most major websites, continuing to run IE8 or lower becomes increasingly difficult so default to not enforcing UTF-8 encoding as it's not relevant to other browsers.

    Andrew White

  • Change translation key of submit_tag from module_name_class_name to module_name/class_name.

    Rui Onodera

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Action Pack

  • Remove deprecated fragment_cache_key helper in favor of combined_fragment_cache_key.

    Rafael Mendonça França

  • Remove deprecated methods in ActionDispatch::TestResponse.

    #success?, missing? and error? were deprecated in Rails 5.2 in favor of #successful?, not_found? and server_error?.

    Rafael Mendonça França

  • Ensure external redirects are explicitly allowed

    Add fallback_location and allow_other_host options to redirect_to.

    Gannon McGibbon

  • Introduce ActionDispatch::HostAuthorization

    This is a new middleware that guards against DNS rebinding attacks by white-listing the allowed hosts a request can be made to.

    Each host is checked with the case operator (#===) to support RegExp, Proc, IPAddr and custom objects as host allowances.

    Genadi Samokovarov

  • Allow using parsed_body in ActionController::TestCase.

    In addition to ActionDispatch::IntegrationTest, allow using parsed_body in ActionController::TestCase:

    class SomeControllerTest < ActionController::TestCase
      def test_some_action
        post :action, body: { foo: 'bar' }
        assert_equal({ "foo" => "bar" }, response.parsed_body)
      end
    end
    

    Fixes #34676.

    Tobias Bühlmann

  • Raise an error on root route naming conflicts.

    Raises an ArgumentError when multiple root routes are defined in the same context instead of assigning nil names to subsequent roots.

    Gannon McGibbon

  • Allow rescue from parameter parse errors:

    rescue_from ActionDispatch::Http::Parameters::ParseError do
      head :unauthorized
    end
    

    Gannon McGibbon, Josh Cheek

  • Reset Capybara sessions if failed system test screenshot raising an exception.

    Reset Capybara sessions if take_failed_screenshot raise exception in system test after_teardown.

    Maxim Perepelitsa

  • Use request object for context if there's no controller

    There is no controller instance when using a redirect route or a mounted rack application so pass the request object as the context when resolving dynamic CSP sources in this scenario.

    Fixes #34200.

    Andrew White

  • Apply mapping to symbols returned from dynamic CSP sources

    Previously if a dynamic source returned a symbol such as :self it would be converted to a string implicity, e.g:

    policy.default_src -> { :self }
    

    would generate the header:

    Content-Security-Policy: default-src self
    

    and now it generates:

    Content-Security-Policy: default-src 'self'
    

    Andrew White

  • Add ActionController::Parameters#each_value.

    Lukáš Zapletal

  • Deprecate ActionDispatch::Http::ParameterFilter in favor of ActiveSupport::ParameterFilter.

    Yoshiyuki Kinjo

  • Encode Content-Disposition filenames on send_data and send_file. Previously, send_data 'data', filename: "\u{3042}.txt" sends "filename=\"\u{3042}.txt\"" as Content-Disposition and it can be garbled. Now it follows RFC 2231 and RFC 5987 and sends "filename=\"%3F.txt\"; filename*=UTF-8''%E3%81%82.txt". Most browsers can find filename correctly and old browsers fallback to ASCII converted name.

    Fumiaki Matsushima

  • Expose ActionController::Parameters#each_key which allows iterating over keys without allocating an array.

    Richard Schneeman

  • Purpose metadata for signed/encrypted cookies.

    Rails can now thwart attacks that attempt to copy signed/encrypted value of a cookie and use it as the value of another cookie.

    It does so by stashing the cookie-name in the purpose field which is then signed/encrypted along with the cookie value. Then, on a server-side read, we verify the cookie-names and discard any attacked cookies.

    Enable action_dispatch.use_cookies_with_metadata to use this feature, which writes cookies with the new purpose and expiry metadata embedded.

    Assain Jaleel

  • Raises ActionController::RespondToMismatchError with confliciting respond_to invocations.

    respond_to can match multiple types and lead to undefined behavior when multiple invocations are made and the types do not match:

    respond_to do |outer_type|
      outer_type.js do
        respond_to do |inner_type|
          inner_type.html { render body: "HTML" }
        end
      end
    end
    

    Patrick Toomey

  • ActionDispatch::Http::UploadedFile now delegates to_path to its tempfile.

    This allows uploaded file objects to be passed directly to File.read without raising a TypeError:

    uploaded_file = ActionDispatch::Http::UploadedFile.new(tempfile: tmp_file)
    File.read(uploaded_file)
    

    Aaron Kromer

  • Pass along arguments to underlying get method in follow_redirect!.

    Now all arguments passed to follow_redirect! are passed to the underlying get method. This for example allows to set custom headers for the redirection request to the server.

    follow_redirect!(params: { foo: :bar })
    

    Remo Fritzsche

  • Introduce a new error page to when the implicit render page is accessed in the browser.

    Now instead of showing an error page that with exception and backtraces we now show only one informative page.

    Vinicius Stock

  • Introduce ActionDispatch::DebugExceptions.register_interceptor.

    Exception aware plugin authors can use the newly introduced .register_interceptor method to get the processed exception, instead of monkey patching DebugExceptions.

    ActionDispatch::DebugExceptions.register_interceptor do |request, exception|
      HypoteticalPlugin.capture_exception(request, exception)
    end
    

    Genadi Samokovarov

  • Output only one Content-Security-Policy nonce header value per request.

    Fixes #32597.

    Andrey Novikov, Andrew White

  • Move default headers configuration into their own module that can be included in controllers.

    Kevin Deisz

  • Add method dig to session.

    claudiob, Takumi Shotoku

  • Controller level force_ssl has been deprecated in favor of config.force_ssl.

    Derek Prior

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Active Job

  • Return false instead of the job instance when enqueue is aborted.

    This will be the behavior in Rails 6.1 but it can be controlled now with config.active_job.return_false_on_aborted_enqueue.

    Kir Shatrov

  • Keep executions for each specific declaration

    Each retry_on declaration has now its own specific executions counter. Before it was shared between all executions of a job.

    Alberto Almagro

  • Allow all assertion helpers that have a only and except keyword to accept Procs.

    Edouard Chin

  • Restore HashWithIndifferentAccess support to ActiveJob::Arguments.deserialize.

    Gannon McGibbon

  • Include deserialized arguments in job instances returned from assert_enqueued_with and assert_performed_with

    Alan Wu

  • Allow assert_enqueued_with/assert_performed_with methods to accept a proc for the args argument. This is useful to check if only a subset of arguments matches your expectations.

    Edouard Chin

  • ActionDispatch::IntegrationTest includes ActiveJob::TestHelper module by default.

    Ricardo Díaz

  • Added enqueue_retry.active_job, retry_stopped.active_job, and discard.active_job hooks.

    steves

  • Allow assert_performed_with to be called without a block.

    bogdanvlviv

  • Execution of assert_performed_jobs, and assert_no_performed_jobs without a block should respect passed :except, :only, and :queue options.

    bogdanvlviv

  • Allow :queue option to job assertions and helpers.

    bogdanvlviv

  • Allow perform_enqueued_jobs to be called without a block.

    Performs all of the jobs that have been enqueued up to this point in the test.

    Kevin Deisz

  • Move enqueue/enqueue_at notifications to an around callback.

    Improves timing accuracy over the old after callback by including time spent writing to the adapter's IO implementation.

    Zach Kemp

  • Allow call assert_enqueued_with with no block.

    Example: ``` def test_assert_enqueued_with MyJob.perform_later(1,2,3) assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low')

    MyJob.set(wait_until: Date.tomorrow.noon).perform_later assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon) end ```

    bogdanvlviv

  • Allow passing multiple exceptions to retry_on, and discard_on.

    George Claghorn

  • Pass the error instance as the second parameter of block executed by discard_on.

    Fixes #32853.

    Yuji Yaginuma

  • Remove support for Qu gem.

    Reasons are that the Qu gem wasn't compatible since Rails 5.1, gem development was stopped in 2014 and maintainers have confirmed its demise. See issue #32273

    Alberto Almagro

  • Add support for timezones to Active Job.

    Record what was the current timezone in effect when the job was enqueued and then restore when the job is executed in same way that the current locale is recorded and restored.

    Andrew White

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

  • Add support to define custom argument serializers.

    Evgenii Pecherkin, Rafael Mendonça França

Action Mailer

  • Deprecate ActionMailer::Base.receive in favor of Action Mailbox.

    George Claghorn

  • Add MailDeliveryJob for delivering both regular and parameterized mail. Deprecate using DeliveryJob and Parameterized::DeliveryJob.

    Gannon McGibbon

  • Fix ActionMailer assertions not working when a Mail defines a custom delivery job class

    Edouard Chin

  • Mails with multipart format blocks with implicit render now also check for a template name in options hash instead of only using the action name.

    Marcus Ilgner

  • ActionDispatch::IntegrationTest includes ActionMailer::TestHelper module by default.

    Ricardo Díaz

  • Add perform_deliveries to a payload of deliver.action_mailer notification.

    Yoshiyuki Kinjo

  • Change delivery logging message when perform_deliveries is false.

    Yoshiyuki Kinjo

  • Allow call assert_enqueued_email_with with no block.

    Example: ``` def test_email ContactMailer.welcome.deliver_later assert_enqueued_email_with ContactMailer, :welcome end

    def test_email_with_arguments ContactMailer.welcome("Hello", "Goodbye").deliver_later assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"] end ```

    bogdanvlviv

  • Ensure mail gem is eager autoloaded when eager load is true to prevent thread deadlocks.

    Samuel Cochran

  • Perform email jobs in assert_emails.

    Gannon McGibbon

  • Add Base.unregister_observer, Base.unregister_observers, Base.unregister_interceptor, Base.unregister_interceptors, Base.unregister_preview_interceptor and Base.unregister_preview_interceptors. This makes it possible to dynamically add and remove email observers and interceptors at runtime in the same way they're registered.

    Claudio Ortolina, Kota Miyake

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Action Cable

  • Merge action-cable-testing to Rails.

    Vladimir Dementyev

  • The JavaScript WebSocket client will no longer try to reconnect when you call reject_unauthorized_connection on the connection.

    Mick Staugaard

  • ActionCable.Connection#getState now references the configurable ActionCable.adapters.WebSocket property rather than the WebSocket global variable, matching the behavior of ActionCable.Connection#open.

    Richard Macklin

  • The ActionCable javascript package has been converted from CoffeeScript to ES2015, and we now publish the source code in the npm distribution.

    This allows ActionCable users to depend on the javascript source code rather than the compiled code, which can produce smaller javascript bundles.

    This change includes some breaking changes to optional parts of the ActionCable javascript API:

    • Configuration of the WebSocket adapter and logger adapter have been moved from properties of ActionCable to properties of ActionCable.adapters. If you are currently configuring these adapters you will need to make these changes when upgrading:
      -    ActionCable.WebSocket = MyWebSocket
      +    ActionCable.adapters.WebSocket = MyWebSocket
    
      -    ActionCable.logger = myLogger
      +    ActionCable.adapters.logger = myLogger
    
    • The ActionCable.startDebugging() and ActionCable.stopDebugging() methods have been removed and replaced with the property ActionCable.logger.enabled. If you are currently using these methods you will need to make these changes when upgrading:
      -    ActionCable.startDebugging()
      +    ActionCable.logger.enabled = true
    
      -    ActionCable.stopDebugging()
      +    ActionCable.logger.enabled = false
    

    Richard Macklin

  • Add id option to redis adapter so now you can distinguish ActionCable's redis connections among others. Also, you can set custom id in options.

    Before: $ redis-cli client list id=669 addr=127.0.0.1:46442 fd=8 name= age=18 ...

    After: $ redis-cli client list id=673 addr=127.0.0.1:46516 fd=8 name=ActionCable-PID-19413 age=2 ...

    Ilia Kasianenko

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Active Storage

  • Replace config.active_storage.queue with two options that indicate which queues analysis and purge jobs should use, respectively:

    • config.active_storage.queues.analysis
    • config.active_storage.queues.purge

    config.active_storage.queue is preferred over the new options when it's set, but it is deprecated and will be removed in Rails 6.1.

    George Claghorn

  • Permit generating variants of TIFF images.

    Luciano Sousa

  • Use base36 (all lowercase) for all new Blob keys to prevent collisions and undefined behavior with case-insensitive filesystems and database indices.

    Julik Tarkhanov

  • It doesn’t include an X-CSRF-Token header if a meta tag is not found on the page. It previously included one with a value of undefined.

    Cameron Bothner

  • Fix ArgumentError when uploading to amazon s3

    Hiroki Sanpei

  • Add progressive JPG to default list of variable content types

    Maurice Kühlborn

  • Add ActiveStorage.routes_prefix for configuring generated routes.

    Chris Bisnett

  • ActiveStorage::Service::AzureStorageService only handles specifically relevant types of Azure::Core::Http::HTTPError. It previously obscured other types of HTTPError, which is the azure-storage gem’s catch-all exception class.

    Cameron Bothner

  • ActiveStorage::DiskController#show generates a 404 Not Found response when the requested file is missing from the disk service. It previously raised Errno::ENOENT.

    Cameron Bothner

  • ActiveStorage::Blob#download and ActiveStorage::Blob#open raise ActiveStorage::FileNotFoundError when the corresponding file is missing from the storage service. Services translate service-specific missing object exceptions (e.g. Google::Cloud::NotFoundError for the GCS service and Errno::ENOENT for the disk service) into ActiveStorage::FileNotFoundError.

    Cameron Bothner

  • Added the ActiveStorage::SetCurrent concern for custom Active Storage controllers that can't inherit from ActiveStorage::BaseController.

    George Claghorn

  • Active Storage error classes like ActiveStorage::IntegrityError and ActiveStorage::UnrepresentableError now inherit from ActiveStorage::Error instead of StandardError. This permits rescuing ActiveStorage::Error to handle all Active Storage errors.

    Andrei Makarov, George Claghorn

  • Uploaded files assigned to a record are persisted to storage when the record is saved instead of immediately.

    In Rails 5.2, the following causes an uploaded file in params[:avatar] to be stored:

    @user.avatar = params[:avatar]
    

    In Rails 6, the uploaded file is stored when @user is successfully saved.

    George Claghorn

  • Add the ability to reflect on defined attachments using the existing ActiveRecord reflection mechanism.

    Kevin Deisz

  • Variant arguments of false or nil will no longer be passed to the processor. For example, the following will not have the monochrome variation applied:

      avatar.variant(monochrome: false)
    

    Jacob Smith

  • Generated attachment getter and setter methods are created within the model's GeneratedAssociationMethods module to allow overriding and composition using super.

    Josh Susser, Jamon Douglas

  • Add ActiveStorage::Blob#open, which downloads a blob to a tempfile on disk and yields the tempfile. Deprecate ActiveStorage::Downloading.

    David Robertson, George Claghorn

  • Pass in identify: false as an argument when providing a content_type for ActiveStorage::Attached::{One,Many}#attach to bypass automatic content type inference. For example:

      @message.image.attach(
        io: File.open('/path/to/file'),
        filename: 'file.pdf',
        content_type: 'application/pdf',
        identify: false
      )
    

    Ryan Davidson

  • The Google Cloud Storage service properly supports streaming downloads. It now requires version 1.11 or newer of the google-cloud-storage gem.

    George Claghorn

  • Use the ImageProcessing gem for Active Storage variants, and deprecate the MiniMagick backend.

    This means that variants are now automatically oriented if the original image was rotated. Also, in addition to the existing ImageMagick operations, variants can now use :resize_to_fit, :resize_to_fill, and other ImageProcessing macros. These are now recommended over raw :resize, as they also sharpen the thumbnail after resizing.

    The ImageProcessing gem also comes with a backend implemented on libvips, an alternative to ImageMagick which has significantly better performance than ImageMagick in most cases, both in terms of speed and memory usage. In Active Storage it's now possible to switch to the libvips backend by changing Rails.application.config.active_storage.variant_processor to :vips.

    Janko Marohnić

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen

Action Mailbox

  • Added to Rails.

    DHH

Action Text

  • Added to Rails.

    DHH

Railties

  • Remove deprecated after_bundle helper inside plugins templates.

    Rafael Mendonça França

  • Remove deprecated support to old config.ru that use the application class as argument of run.

    Rafael Mendonça França

  • Remove deprecated environment argument from the rails commands.

    Rafael Mendonça França

  • Remove deprecated capify!.

    Rafael Mendonça França

  • Remove deprecated config.secret_token.

    Rafael Mendonça França

  • Seed database with inline ActiveJob job adapter.

    Gannon McGibbon

  • Add rails db:system:change command for changing databases.

    bin/rails db:system:change --to=postgresql
       force  config/database.yml
        gsub  Gemfile
    

    The change command copies a template config/database.yml with the target database adapter into your app, and replaces your database gem with the target database gem.

    Gannon McGibbon

  • Add rails test:channels.

    bogdanvlviv

  • Use original bundler environment variables during the process of generating a new rails project.

    Marco Costa

  • Send Active Storage analysis and purge jobs to dedicated queues by default.

    Analysis jobs now use the :active_storage_analysis queue, and purge jobs now use the :active_storage_purge queue. This matches Action Mailbox, which sends its jobs to dedicated queues by default.

    George Claghorn

  • Add rails test:mailboxes.

    George Claghorn

  • Introduce guard against DNS rebinding attacks

    The ActionDispatch::HostAuthorization is a new middleware that prevent against DNS rebinding and other Host header attacks. It is included in the development environment by default with the following configuration:

    Rails.application.config.hosts = [
      IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
      IPAddr.new("::/0"),      # All IPv6 addresses.
      "localhost"              # The localhost reserved domain.
    ]
    

    In other environments Rails.application.config.hosts is empty and no Host header checks will be done. If you want to guard against header attacks on production, you have to manually whitelist the allowed hosts with:

    Rails.application.config.hosts << "product.com"
    

    The host of a request is checked against the hosts entries with the case operator (#===), which lets hosts support entries of type RegExp, Proc and IPAddr to name a few. Here is an example with a regexp.

    # Allow requests from subdomains like `www.product.com` and
    # `beta1.product.com`.
    Rails.application.config.hosts << /.*\.product\.com/
    

    A special case is supported that allows you to whitelist all sub-domains:

    # Allow requests from subdomains like `www.product.com` and
    # `beta1.product.com`.
    Rails.application.config.hosts << ".product.com"
    

    Genadi Samokovarov

  • Remove redundant suffixes on generated helpers.

    Gannon McGibbon

  • Remove redundant suffixes on generated integration tests.

    Gannon McGibbon

  • Fix boolean interaction in scaffold system tests.

    Gannon McGibbon

  • Remove redundant suffixes on generated system tests.

    Gannon McGibbon

  • Add an abort_on_failure boolean option to the generator method that shell out (generate, rake, rails_command) to abort the generator if the command fails.

    David Rodríguez

  • Remove app/assets and app/javascript from eager_load_paths and autoload_paths.

    Gannon McGibbon

  • Use Ids instead of memory addresses when displaying references in scaffold views.

    Fixes #29200.

    Rasesh Patel

  • Adds support for multiple databases to rails db:migrate:status. Subtasks are also added to get the status of individual databases (eg. rails db:migrate:status:animals).

    Gannon McGibbon

  • Use Webpacker by default to manage app-level JavaScript through the new app/javascript directory. Sprockets is now solely in charge, by default, of compiling CSS and other static assets. Action Cable channel generators will create ES6 stubs rather than use CoffeeScript. Active Storage, Action Cable, Turbolinks, and Rails-UJS are loaded by a new application.js pack. Generators no longer generate JavaScript stubs.

    DHH, Lachlan Sylvester

  • Add database (aliased as db) option to model generator to allow setting the database. This is useful for applications that use multiple databases and put migrations per database in their own directories.

    bin/rails g model Room capacity:integer --database=kingston
          invoke  active_record
          create    db/kingston_migrate/20180830151055_create_rooms.rb
    

    Because rails scaffolding uses the model generator, you can also specify a database with the scaffold generator.

    Gannon McGibbon

  • Raise an error when "recyclable cache keys" are being used by a cache store that does not explicitly support it. Custom cache keys that do support this feature can bypass this error by implementing the supports_cache_versioning? method on their class and returning a truthy value.

    Richard Schneeman

  • Support environment specific credentials overrides.

    So any environment will look for config/credentials/#{Rails.env}.yml.enc and fall back to config/credentials.yml.enc.

    The encryption key can be in ENV["RAILS_MASTER_KEY"] or config/credentials/production.key.

    Environment credentials overrides can be edited with rails credentials:edit --environment production. If no override is setup for the passed environment, it will be created.

    Additionally, the default lookup paths can be overwritten with these configs:

    • config.credentials.content_path
    • config.credentials.key_path

    Wojciech Wnętrzak

  • Make ActiveSupport::Cache::NullStore the default cache store in the test environment.

    Michael C. Nelson

  • Emit warning for unknown inflection rule when generating model.

    Yoshiyuki Kinjo

  • Add database (aliased as db) option to migration generator.

    If you're using multiple databases and have a folder for each database for migrations (ex db/migrate and db/new_db_migrate) you can now pass the --database option to the generator to make sure the the migration is inserted into the correct folder.

    rails g migration CreateHouses --database=kingston
      invoke  active_record
      create    db/kingston_migrate/20180830151055_create_houses.rb
    

    Eileen M. Uchitelle

  • Deprecate rake routes in favor of rails routes.

    Yuji Yaginuma

  • Deprecate rake initializers in favor of rails initializers.

    Annie-Claude Côté

  • Deprecate rake dev:cache in favor of rails dev:cache.

    Annie-Claude Côté

  • Deprecate rails notes subcommands in favor of passing an annotations argument to rails notes.

    The following subcommands are replaced by passing --annotations or -a to rails notes:

    • rails notes:custom ANNOTATION=custom is deprecated in favor of using rails notes -a custom.
    • rails notes:optimize is deprecated in favor of using rails notes -a OPTIMIZE.
    • rails notes:todo is deprecated in favor of usingrails notes -a TODO.
    • rails notes:fixme is deprecated in favor of using rails notes -a FIXME.

    Annie-Claude Côté

  • Deprecate SOURCE_ANNOTATION_DIRECTORIES environment variable used by rails notes through Rails::SourceAnnotationExtractor::Annotation in favor of using config.annotations.register_directories.

    Annie-Claude Côté

  • Deprecate rake notes in favor of rails notes.

    Annie-Claude Côté

  • Don't generate unused files in app:update task.

    Skip the assets' initializer when sprockets isn't loaded.

    Skip config/spring.rb when spring isn't loaded.

    Skip yarn's contents when yarn integration isn't used.

    Tsukuru Tanimichi

  • Make the master.key file read-only for the owner upon generation on POSIX-compliant systems.

    Previously:

    $ ls -l config/master.key
    -rw-r--r--   1 owner  group      32 Jan 1 00:00 master.key
    

    Now:

    $ ls -l config/master.key
    -rw-------   1 owner  group      32 Jan 1 00:00 master.key
    

    Fixes #32604.

    Jose Luis Duran

  • Deprecate support for using the HOST environment to specify the server IP.

    The BINDING environment should be used instead.

    Fixes #29516.

    Yuji Yaginuma

  • Deprecate passing Rack server name as a regular argument to rails server.

    Previously:

    $ bin/rails server thin
    

    There wasn't an explicit option for the Rack server to use, now we have the --using option with the -u short switch.

    Now:

    $ bin/rails server -u thin
    

    This change also improves the error message if a missing or mistyped rack server is given.

    Genadi Samokovarov

  • Add "rails routes --expanded" option to output routes in expanded mode like "psql --expanded". Result looks like:

    $ rails routes --expanded
    --[ Route 1 ]------------------------------------------------------------
    Prefix            | high_scores
    Verb              | GET
    URI               | /high_scores(.:format)
    Controller#Action | high_scores#index
    --[ Route 2 ]------------------------------------------------------------
    Prefix            | new_high_score
    Verb              | GET
    URI               | /high_scores/new(.:format)
    Controller#Action | high_scores#new
    

    Benoit Tigeot

  • Rails 6 requires Ruby 2.5.0 or newer.

    Jeremy Daer, Kasper Timm Hansen