This Week in Rails

December 31, 2021

This Year in Rails! A summary of 2021 in the Rails world

Hi there, this is Greg, bringing you a summary of what happened in the Rails world in 2021.
There were so many changes, it is difficult to decide which one to mention, but I tried my best to find a few notable changes

Find and assert the presence of exactly one record
Add FinderMethods#sole and #find_sole_by to find and assert the presence of exactly one record. Based on this, Enumerable#sole returns the sole item of the enumerable. If there are no items, or more than one item it will raise an exception.

Add ActionController::Live#send_stream
Adds the ability to live stream binary data to the browser like send_data does for static files.

Add Model.update! that is similar to Model.update but raises exceptions
You may be familiar with the instance method Model#update!, but now you can do that on the class!

Active Record destroy_all performs in batches
By default it will load records in batches of 100 and allow to specify the custom batch size.

Add possibility to configure Active Storage for Action Mailbox
It is now possible to configure Active Storage service for storing email raw source via config.action_mailbox.storage_service.

Raise error on unpermitted open redirects
Add allow_other_host_ options to redirect_to. One can opt in to this behaviour with ActionController::Base.raise_on_open_redirects = true.

Update Capybara drivers
Deprecate poltergeist and webkit (capybara-webkit) driver registration for system testing (they will be removed in Rails 7.1) and add cuprite instead.

Create database via UI when ActiveRecord::NoDatabaseError
This PR adds the possibility to create the database via the UI when database has not been created in development mode.

Add ActiveRecord::QueryMethods#in_order_of
#in_order_of allows you to specify an explicit order that you'd like records returned in based on a SQL expression, for instance: Post.in_order_of(:id, [3, 5, 1])

Support for byte ranges in Active Storage
This PR allows serving uploads in chunks in order to stream buffered files as is required e.g. audio podcasts from S3 to an iPhone.

Replace Byebug with ruby/debug
Ruby 3.1 will launch with a new first-class debugger that works great with Rails. 
Let's all appreciate the many years Byebug has helped us ship software.

Add SSL support for postgresql in "bin/rails dbconsole"
This PR fixes the dbconsole command when used with PostgreSQL to support encrypted connections.

Introduce ActiveModel::API
Make ActiveModel::API the minimum API to talk with Action Pack and Action View. This will allow adding more functionality to ActiveModel::Model.

GitHub Codespaces configuration
This PR adds support for GitHub Codespaces, which allows contributors to easily boot a fully functional environment to create patches and test changes to Rails.

Standardised error reporting interface
Rails.error is a new error reporting interface, with two block based methods. handle, which swallows errors and forwards them to the subscribers:
   Rails.error.handle do 1 + '1' # raises TypeError end 1 + 1 # This will be executed

and record, which forwards the errors to the subscribes but lets it continue rewinding the call stack:
    Rails.error.record do 1 + '1' # raises TypeError end 1 + 1 # This won't be executed.

For cases where the blocked based API isn't suitable, the lower level report method can be used:

    Rails.error.report(error, handled: true / false)

529 amazing people contributed 3716 commits to Rails this year! A new major version of Rails has been released recently, including features like At-Work Encryption with Active Record, Async Query Loading, Zeitwerk code loader better CSS and Javascript bundling, and Rails also got a new website and booting screen!
Thanks for everyone and see you next year!