## Rails 8.1.3 (March 24, 2026) ##

*   Fix Ruby 4.0 delegator warning when calling inspect on attributes.

    *Hammad Khan*

*   Fix `NoMethodError` when deserialising `Type::Integer` objects marshalled under Rails 8.0.

    The performance optimisation that replaced `@range` with `@max`/`@min`
    broke Marshal compatibility. Objects serialised under 8.0 (with `@range`)
    and deserialised under 8.1 (expecting `@max`/`@min`) would crash with
    `undefined method '<=' for nil` because `Marshal.load` restores instance
    variables without calling `initialize`.

    *Edward Woodcock*


## Rails 8.1.2.1 (March 23, 2026) ##

*   No changes.


## Rails 8.1.2 (January 08, 2026) ##

*   No changes.


## Rails 8.1.1 (October 28, 2025) ##

*   No changes.


## Rails 8.1.0 (October 22, 2025) ##

*   Add `reset_token: { expires_in: ... }` option to `has_secure_password`.

    Allows configuring the expiry duration of password reset tokens (default remains 15 minutes for backwards compatibility).

    ```ruby
    has_secure_password reset_token: { expires_in: 1.hour }
    ```

    *Jevin Sew*, *Abeid Ahmed*

*   Add `except_on:` option for validation callbacks.

    *Ben Sheldon*

*   Backport `ActiveRecord::Normalization` to `ActiveModel::Attributes::Normalization`

    ```ruby
    class User
      include ActiveModel::Attributes
      include ActiveModel::Attributes::Normalization

      attribute :email, :string

      normalizes :email, with: -> email { email.strip.downcase }
    end

    user = User.new
    user.email =    " CRUISE-CONTROL@EXAMPLE.COM\n"
    user.email # => "cruise-control@example.com"
    ```

    *Sean Doyle*

Please check [8-0-stable](https://github.com/rails/rails/blob/8-0-stable/activemodel/CHANGELOG.md) for previous changes.
