Rails 7.1 Adds Rails.application.deprecators Method

Deprecations are warnings that notify developers about features slated for removal or change in future versions. They ensure a smooth transition to newer alternatives while maintaining compatibility.

Before

Before Rails 7.1, deprecations were managed globally through ActiveSupport::Deprecation, with no way to differentiate or individually configure different types of deprecations and it lacked flexibility for managing multiple deprecations.

class User < ApplicationRecord
  def full_name
    ActiveSupport::Deprecation.warn("The `full_name` method will be removed in the next major release.")
  end
end
user = User.first
user.full_name

DEPRECATION WARNING: The `full_name` method will be removed in the next major release. (called from <main> at (irb):2)
DEPRECATION WARNING: Calling warn on ActiveSupport::Deprecation is deprecated and will be removed from Rails (use your own Deprecation object instead) (called from full_name at /app/models/user.rb:3)
=> "DEPRECATION WARNING: The `full_name` method will be removed in the next major release. (called from <main> at (irb):2)"

After

Rails 7.1 introduces Rails.application.deprecators method which allows us to manage deprecators more effectively within our application. This gives us fine-grained control over individual warnings, including enabling, disabling, or debugging them separately.

Create and Use Specific Deprecators

1) Define a Custom Deprecator:

# config/initializers/deprecators.rb

Rails.application.deprecators[:user_full_name] = ActiveSupport::Deprecation.new("2.0", "user_full_name")

Here, the custom deprecator :user_full_name is defined for deprecations related to the full_name method, specifying the Rails version (2.0) and a name for context.

2) Use the Deprecator in Code:

class User < ApplicationRecord
  def full_name
    Rails.application.deprecators[:user_full_name].warn("The `full_name` method will be removed in the next major release.")
  end
end

Deprecation warnings are now tied to :user_full_name, allowing specific control over its behavior.

user = User.first
user.full_name

=> "DEPRECATION WARNING: The `full_name` method will be removed in the next major release. (called from <main> at (irb):2)"

Enable Debug Mode for Deprecators

Debug mode enhances deprecation warnings by including detailed stack traces, helping developers locate the source of deprecated method calls.

1) Enable Debug Mode Globally:

Rails.application.deprecators.debug = true

When enabled globally, all deprecation warnings in the application will include stack traces.

2) Enable Debug Mode for Specific Deprecators:

Rails.application.deprecators[:user_full_name].debug
#=> true

This ensures only warnings related to :user_full_name include debugging details, keeping logs manageable.

Silence Deprecation Warnings Temporarily

Temporarily silencing deprecation warnings allows us to suppress noise during specific operations, such as migrations, tests, or background tasks.

Rails.application.deprecators.silence do
  Rails.application.deprecators[:user_full_name].warn    # => silenced (no warning)
  Rails.application.deprecators[:other_gem].warn # => silenced (no warning)
end

These improvements make managing deprecations more granular and developer-friendly.

Need help on your Ruby on Rails or React project?

Join Our Newsletter