Skip to content

Upgrading activestorage 7 to 8

Breaking7.2.4 → 8.1.4Breaking49Security21Platform1Deprecated24New230Changed182Fixed372Other8

BreakingUpgrade verdict

49 breaking changes and a platform requirement change and 21 security fixes.

  • Code that passed a Time object to Time#since no longer works and must be updated.
  • Benchmark.ms is no longer part of Active Support; use the benchmark gem instead.
  • Adding a Time and an ActiveSupport::TimeWithZone no longer works as before.
  • to_time now always keeps the receiver's timezone instead of optionally using the system local time.
Top 5 of 93 that need code or config changes

Ruby requirement changed in 8.0.0.beta1: >= 3.1.0 → >= 3.2.0.

Breaking49
Removes deprecated support for passing a Time object to Time#since.
Time#since
Removes the deprecated Benchmark.ms method, now defined in the benchmark gem.
Benchmark.ms
Removes deprecated addition of Time instances with ActiveSupport::TimeWithZone.
TimeActiveSupport::TimeWithZone
Removes deprecated support for to_time preserving the system local time; it now always preserves the receiver timezone.
to_time
Removes deprecated :unsigned_float and :unsigned_decimal column methods for MySQL.
:unsigned_float:unsigned_decimal
Removes deprecated :retries option for the SQLite3 adapter.
:retries
Removes deprecated support to route to multiple paths.
Removes deprecated support for using semicolons as a query string separator.
ActionDispatch::QueryParser.each_pair
Removes deprecated support for skipping over leading brackets in parameter names in the parameter parser.
ActionDispatch::ParamBuilder.from_query_string
The JSON renderer no longer escapes HTML entities or Unicode line separators by default; use escape: true or config.action_controller.escape_json_responses to restore.
render json:escapeconfig.action_controller.escape_json_responsescallback
Removes support for setting ActiveJob::Base.enqueue_after_transaction_commit to :never, :always and :default.
ActiveJob::Base.enqueue_after_transaction_commit
Removes deprecated Rails.application.config.active_job.enqueue_after_transaction_commit.
Rails.application.config.active_job.enqueue_after_transaction_commit
Removes the deprecated :azure storage service.
:azure
Removes deprecated STATS_DIRECTORIES.
STATS_DIRECTORIES
Removes the deprecated bin/rake stats command.
bin/rake stats
Removes the deprecated rails/console/methods.rb file.
rails/console/methods.rb
Removes deprecated support for passing an array of strings to ActiveSupport::Deprecation#warn.
ActiveSupport::Deprecation#warn
Removes deprecated support for setting attr_internal_naming_format with a @ prefix.
attr_internal_naming_format
Removes the deprecated ActiveSupport::ProxyObject.
ActiveSupport::ProxyObject
Removes deprecated support for setting ENV["SCHEMA_CACHE"].
ENV["SCHEMA_CACHE"]
Removes deprecated support for passing a database name to cache_dump_filename.
cache_dump_filename
Removes deprecated ActiveRecord::ConnectionAdapters::ConnectionPool#connection.
ActiveRecord::ConnectionAdapters::ConnectionPool#connection
Removes deprecated config.active_record.sqlite3_deprecated_warning.
config.active_record.sqlite3_deprecated_warning
Removes deprecated config.active_record.warn_on_records_fetched_greater_than.
config.active_record.warn_on_records_fetched_greater_than
Removes deprecated support for defining enum with keyword arguments.
enum
Removes deprecated support for finding database adapters that are not registered to Active Record.
Removes deprecated config.active_record.allow_deprecated_singular_associations_name.
config.active_record.allow_deprecated_singular_associations_name
Removes deprecated config.active_record.commit_transaction_on_non_local_return.
config.active_record.commit_transaction_on_non_local_return
Deletes the deprecated constant ActiveRecord::ImmutableRelation.
ActiveRecord::ImmutableRelation
Removes deprecated support for passing content to void tag elements on the tag builder.
tag
Removes deprecated support for passing nil to the model: argument of form_with.
form_with
Removes Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality.
Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality
Removes deprecated config.active_job.use_big_decimal_serializer.
config.active_job.use_big_decimal_serializer
Removes deprecated support for extending the Rails console through Rails::ConsoleMethods.
Rails::ConsoleMethods
Removes the deprecated file rails/console/helpers.
rails/console/helpers
Removes the deprecated file rails/console/app.
rails/console/app
Removes deprecated config.read_encrypted_secrets.
config.read_encrypted_secrets
Always clears CurrentAttributes instances, abandoning them at request end and creating a new instance on the next request.
CurrentAttributes
Makes :class_name invalid in polymorphic belongs_to associations.
class_namebelongs_to
Raises AbstractController::DoubleRenderError when head is called after rendering.
AbstractController::DoubleRenderErrorhead
A route pointing to a non-existing controller now returns 500 instead of 404.
Removes the deprecated internal SuckerPunch adapter in favor of the adapter included with the sucker_punch gem.
SuckerPunch
Always clears CurrentAttributes instances by abandoning them at request end and creating a new instance at the next request start.
CurrentAttributes
Makes :class_name invalid in polymorphic belongs_to associations.
belongs_toclass_name
Raises AbstractController::DoubleRenderError when head is called after rendering.
headAbstractController::DoubleRenderError
A route pointing to a non-existing controller now returns 500 instead of 404.
:controller
Removes the deprecated internal SuckerPunch adapter in favor of the adapter included with the sucker_punch gem.
SuckerPunchsucker_punch
Fixes ActiveSupport::HashWithIndifferentAccess#stringify_keys to stringify all keys, not just symbols.
ActiveSupport::HashWithIndifferentAccess#stringify_keys
Raises when EncryptedConfiguration is given a key that cannot respond to #to_sym, such as an Integer or Float.
EncryptedConfiguration#to_sym
Security21
Limits the size of strings ActiveModel::Type::Integer coerces with to_i to avoid a DoS vector from very long strings.
ActiveModel::Type::Integerto_i
Filters the database password out of failed db: task command error messages.
Rejects malformed hosts with extra ports in ActionDispatch::HostAuthorization.
ActionDispatch::HostAuthorization
Fixes possible XSS in DebugExceptions middleware.
DebugExceptions
Filters attributes listed in filter_attributes also through filter_parameters to avoid leaking sensitive information.
filter_attributesfilter_parameters
Rate limits password resets in the authentication generator to mitigate abuse from attackers spamming the password reset form.
Rate limits password resets in the authentication generator to mitigate abuse from spamming the password reset form.
Disables libvips unfuzzed image loaders and savers via Vips.block_untrusted(true) at boot, and raises RuntimeError if libvips < 8.13 or ruby-vips < 2.2.1.
Vips.block_untrusted(true)Vips::Errorconfig.active_storage.variable_content_types:mini_magickCritical
Rejects scientific notation in NumberConverter.
NumberConverter
Fixes SafeBuffer#% to preserve unsafe status.
SafeBuffer#%
Improves performance of NumberToDelimitedConverter.
NumberToDelimitedConverter
Skips blank attribute names in tag helpers to avoid generating invalid HTML.
Filters user supplied metadata in DirectUploadController.
DirectUploadControllerModerate
Adds a configurable maximum streaming chunk size, defaulting to 100mb byte ranges for blobs.
Moderate
Limits range requests to a single range.
Low · CVSS 6.5
Prevents path traversal in DiskService; path_for raises InvalidKeyError for dot segments or paths outside the storage root.
DiskServiceDiskService#path_forInvalidKeyErrorDiskControllerHigh
Prevents glob injection in DiskService#delete_prefixed by escaping glob metacharacters, breaking code that relied on glob expansion.
DiskService#delete_prefixedDir.globModerate
Calls inspect on ids in RecordNotFound error to address CVE-2025-55193.
RecordNotFound
Removes dangerous transformations to address CVE-2025-24293.
Critical
Adds validation to content security policies to disallow spaces and semicolons.
Sets Regexp.timeout to 1 second by default to improve security against Regexp Denial-of-Service attacks.
Regexp.timeout
Platform1
Raises minimum supported libvips to 8.13 and ruby-vips to 2.2.1, raising RuntimeError at boot when ruby-vips is installed and either minimum is unmet.
RuntimeError
Deprecated22
Deprecates config.active_support.to_time_preserves_timezone.
config.active_support.to_time_preserves_timezone
Deprecates String#mb_chars and ActiveSupport::Multibyte::Chars.
String#mb_charsActiveSupport::Multibyte::Chars
Deprecates ActiveSupport::Configurable.
ActiveSupport::Configurable
Deprecates using insert_all/upsert_all with unpersisted records in associations.
insert_allupsert_all
Deprecates using update_all with WITH, WITH RECURSIVE or DISTINCT statements, which were ignored; an error will be raised in a future release.
update_alldelete_all
Deprecates Rails.application.config.action_dispatch.ignore_leading_brackets.
Rails.application.config.action_dispatch.ignore_leading_brackets
Deprecates the built-in sidekiq adapter; use sidekiq 7.3.3 or later and the sidekiq gem's adapter.
sidekiq
Deprecates String#mb_chars and ActiveSupport::Multibyte::Chars.
String#mb_charsActiveSupport::Multibyte::Chars
Deprecates using insert_all/upsert_all with unpersisted records in associations.
insert_allupsert_all
Deprecates using update_all with WITH, WITH RECURSIVE or DISTINCT statements, which will raise in a future release.
update_alldelete_all
Deprecates the built-in sidekiq adapter; use sidekiq 7.3.3 or later and the sidekiq gem's adapter.
sidekiq
Deprecates the Benchmark.ms core extension as the benchmark gem becomes bundled in Ruby 3.5.
Benchmark.ms
Deprecates addition and since between two Time or ActiveSupport::TimeWithZone instances, to be removed in Rails 8.1.
TimeActiveSupport::TimeWithZonesince
Deprecates unsigned_float and unsigned_decimal short-hand column methods.
unsigned_floatunsigned_decimal
Deprecates drawing routes with multiple paths to make routing faster.
with_optionsget
Deprecates sucker_punch as an adapter option.
sucker_punchadapter: async
Deprecates ActiveStorage::Service::AzureStorageService.
ActiveStorage::Service::AzureStorageService
Deprecates ::STATS_DIRECTORIES in favor of Rails::CodeStatistics.register_directory.
STATS_DIRECTORIESRails::CodeStatistics.register_directory
Deprecates bin/rake stats in favor of bin/rails stats.
bin/rake statsbin/rails stats
Deprecates the Benchmark.ms core extension, since the benchmark gem becomes bundled in Ruby 3.5.
Benchmark.ms
Deprecates sucker_punch as an Active Job adapter option.
sucker_punchadapter
Deprecates the ::STATS_DIRECTORIES constant in favor of Rails::CodeStatistics.register_directory.
STATS_DIRECTORIESRails::CodeStatistics.register_directory