Skip to main content
More at rubyonrails.org:

Ruby on Rails 8.1 Release Notes

Highlights in Rails 8.1:

  • Active Job Continuations.
  • Structured Event Reporting.
  • Local CI.
  • Markdown Rendering.
  • Command-line Credentials Fetching.
  • Deprecated Associations.

These release notes cover only the major changes. To learn about various bug fixes and changes, please refer to the changelogs or check out the list of commits in the main Rails repository on GitHub.

1. Upgrading to Rails 8.1

If you're upgrading an existing application, it's a great idea to have good test coverage before going in. You should also first upgrade to Rails 8.0 in case you haven't and make sure your application still runs as expected before attempting an update to Rails 8.1. A list of things to watch out for when upgrading is available in the Upgrading Ruby on Rails guide.

2. Major Features

2.1. Active Job Continuations

Long-running jobs can now be broken into discrete steps that allow execution to continue from the last completed step rather than the beginning after a restart. This is especially helpful when doing deploys with Kamal, which will only give job-running containers thirty seconds to shut down by default.

Example:

class ProcessImportJob < ApplicationJob
 include ActiveJob::Continuable
 def perform(import_id)
 @import = Import.find(import_id)
 # block format
 step :initialize do
 @import.initialize
 end
 # step with cursor, the cursor is saved when the job is interrupted
 step :process do |step|
 @import.records.find_each(start: step.cursor) do |record|
 record.process
 step.advance! from: record.id
 end
 end
 # method format
 step :finalize
 end
 private
 def finalize
 @import.finalize
 end
end

3. Structured Event Reporting

The default logger in Rails is great for human consumption, but less ideal for post-processing. The new Event Reporter provides a unified interface for producing structured events in Rails applications:

Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")

It supports adding tags to events:

Rails.event.tagged("graphql") do
 # Event includes tags: { graphql: true }
 Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")
end

As well as context: ```ruby

All events will contain context: {request_id: "abc123", shop_id: 456}

Rails.event.set_context(request_id: "abc123", shop_id: 456) ```

Events are emitted to subscribers. Applications register subscribers to control how events are serialized and emitted. Subscribers must implement an #emit method, which receives the event hash:

class LogSubscriber
 def emit(event)
 payload = event[:payload].map { |key, value| "#{key}=#{value}" }.join(" ")
 source_location = event[:source_location]
 log = "[#{event[:name]}] #{payload} at #{source_location[:filepath]}:#{source_location[:lineno]}"
 Rails.logger.info(log)
 end
end

4. Local CI

Developer machines have gotten incredibly quick with loads of cores, which make them great local runners of even relatively large test suites.

This makes getting rid of a cloud-setup for all of CI not just feasible but desirable for many small-to-mid-sized applications, and Rails has therefore added a default CI declaration DSL, which is defined in config/ci.rb and run by bin/ci. It looks like this:

CI.run do
 step "Setup", "bin/setup --skip-server"
 step "Style: Ruby", "bin/rubocop"
 step "Security: Gem audit", "bin/bundler-audit"
 step "Security: Importmap vulnerability audit", "bin/importmap audit"
 step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error"
 step "Tests: Rails", "bin/rails test"
 step "Tests: Seeds", "env RAILS_ENV=test bin/rails db:seed:replant"
 # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`.
 if success?
 step "Signoff: All systems go. Ready for merge and deploy.", "gh signoff"
 else
 failure "Signoff: CI failed. Do not merge or deploy.", "Fix the issues and try again."
 end
end

The optional integration with gh ensures that PRs must be signed off by a passing CI run in order to be eligible to be merged.

5. Markdown Rendering

Markdown has become the lingua franca of AI, and Rails has embraced this adoption by making it easier to respond to markdown requests and render them directly:

class Page
 def to_markdown
 body
 end
end
class PagesController < ActionController::Base
 def show
 @page = Page.find(params[:id])
 respond_to do |format|
 format.html
 format.md { render markdown: @page }
 end
 end
end

6. Command-line Credentials Fetching

Kamal can now easily grab its secrets from the encrypted Rails credentials store for deploys. This makes it a low-fi alternative to external secret stores that only needs the master key available to work:

# .kamal/secrets
KAMAL_REGISTRY_PASSWORD=$(rails credentials:fetch kamal.registry_password)

7. Deprecated Associations

Active Record associations can now be marked as being deprecated:

class Author < ApplicationRecord
 has_many :posts, deprecated: true
end

With that, usage of the posts association will be reported. This includes explicit API calls like

author.posts
author.posts = ...

and others, as well as indirect usage like

author.preload(:posts)

usage via nested attributes, and more.

Three reporting modes are supported (:warn, :raise, and :notify), and backtraces can be enabled or disabled, though you always get the location of the reported usage regardless. Defaults are :warn mode and disabled backtraces.

8. Railties

Please refer to the Changelog for detailed changes.

8.1. Removals

  • Remove deprecated rails/console/methods.rb file.

  • Remove deprecated bin/rake stats command.

  • Remove deprecated STATS_DIRECTORIES.

8.2. Deprecations

8.3. Notable changes

9. Action Cable

Please refer to the Changelog for detailed changes.

9.1. Removals

9.2. Deprecations

9.3. Notable changes

10. Action Pack

Please refer to the Changelog for detailed changes.

10.1. Removals

  • Remove deprecated support to skipping over leading brackets in parameter names in the parameter parser.

    Before:

    ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "foo" => "bar" }
    ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "foo" => { "bar" => "baz" } }
    

    After:

    ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "[foo]" => "bar" }
    ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "[foo]" => { "bar" => "baz" } }
    
  • Remove deprecated support for using semicolons as a query string separator.

    Before:

    ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a
    # => [["foo", "bar"], ["baz", "quux"]]
    

    After:

    ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a
    # => [["foo", "bar;baz=quux"]]
    
  • Remove deprecated support to a route to multiple paths.

10.2. Deprecations

  • Deprecate Rails.application.config.action_dispatch.ignore_leading_brackets.

10.3. Notable changes

  • Redirects are now verbose in development for new Rails apps. To enable it in an existing app, add config.action_dispatch.verbose_redirect_logs = true to your config/development.rb file.

11. Action View

Please refer to the Changelog for detailed changes.

11.1. Removals

11.2. Deprecations

11.3. Notable changes

12. Action Mailer

Please refer to the Changelog for detailed changes.

12.1. Removals

12.2. Deprecations

12.3. Notable changes

13. Active Record

Please refer to the Changelog for detailed changes.

13.1. Removals

  • Remove deprecated :retries option for the SQLite3 adapter.

  • Remove deprecated :unsigned_float and :unsigned_decimal column methods for MySQL.

13.2. Deprecations

  • Deprecate using an order dependent finder method (e.g. #first) without an order.

  • Deprecate ActiveRecord::Base.signed_id_verifier_secret in favor of Rails.application.message_verifiers (or Model.signed_id_verifier if the secret is specific to a model).

  • Deprecate using insert_all/upsert_all with unpersisted records in associations.

  • Deprecate usage of WITH, WITH RECURSIVE and DISTINCT with update_all.

13.3. Notable changes

14. Active Storage

Please refer to the Changelog for detailed changes.

14.1. Removals

  • Remove deprecated :azure storage service.

14.2. Deprecations

14.3. Notable changes

15. Active Model

Please refer to the Changelog for detailed changes.

15.1. Removals

15.2. Deprecations

15.3. Notable changes

16. Active Support

Please refer to the Changelog for detailed changes.

16.1. Removals

  • Remove deprecated passing a Time object to Time#since.

  • Remove deprecated Benchmark.ms method. It is now defined in the benchmark gem.

  • Remove deprecated addition for Time instances with ActiveSupport::TimeWithZone.

  • Remove deprecated support for to_time to preserve the system local time. It will now always preserve the receiver timezone.

16.2. Deprecations

  • Deprecate config.active_support.to_time_preserves_timezone.

  • Deprecate String#mb_chars and ActiveSupport::Multibyte::Chars.

  • Deprecate ActiveSupport::Configurable.

16.3. Notable changes

17. Active Job

Please refer to the Changelog for detailed changes.

17.1. Removals

  • Remove support to set ActiveJob::Base.enqueue_after_transaction_commit to :never, :always and :default.

  • Remove deprecated Rails.application.config.active_job.enqueue_after_transaction_commit.

  • Remove deprecated internal SuckerPunch adapter in favor of the adapter included with the sucker_punch gem.

17.2. Deprecations

  • Custom Active Job serializers must have a public #klass method.

  • Deprecate built-in sidekiq adapter (now provided by sidekiq gem).

17.3. Notable changes

18. Action Text

Please refer to the Changelog for detailed changes.

18.1. Removals

18.2. Deprecations

18.3. Notable changes

19. Action Mailbox

Please refer to the Changelog for detailed changes.

19.1. Removals

19.2. Deprecations

19.3. Notable changes

20. Ruby on Rails Guides

Please refer to the Changelog for detailed changes.

20.1. Notable changes

21. Credits

See the full list of contributors to Rails for the many people who spent many hours making Rails, the stable and robust framework it is. Kudos to all of them.


Feedback

You're encouraged to help improve the quality of this guide.

Please contribute if you see any typos or factual errors. To get started, you can read our documentation contributions section.

You may also find incomplete content or stuff that is not up to date. Please do add any missing documentation for main. Make sure to check Edge Guides first to verify if the issues are already fixed or not on the main branch. Check the Ruby on Rails Guides Guidelines for style and conventions.

If for whatever reason you spot something to fix but cannot patch it yourself, please open an issue.

And last but not least, any kind of discussion regarding Ruby on Rails documentation is very welcome on the official Ruby on Rails Forum.


Back to top

AltStyle によって変換されたページ (->オリジナル) /