From 2bcf0762eb7dd978cdef60e3dfd981d64de63a1b Mon Sep 17 00:00:00 2001 From: swamp09 Date: Mon, 20 Jan 2025 19:36:18 +0900 Subject: [PATCH] Fix preferences serialization compatibility with Rails version check This PR modifies the Persistable module in Solidus to check the Rails version using Rails.gem_version instead of inspecting the serialize method parameters. This change is necessary only when using Solidus Globalize, ensuring compatibility with Rails 7.2. ## Background Solidus itself does not have any issues with the current implementation: ``` if method(:serialize).parameters.include?([:key, :type]) # Rails 7.1+ serialize :preferences, type: Hash, coder: YAML else serialize :preferences, Hash, coder: YAML end ``` However, when using Solidus Globalize, which relies on globalize, an issue arises in Rails 7.2 due to globalize overriding the serialize method: ``` ArgumentError: wrong number of arguments (given 2, expected 1) ``` This occurs because the serialize method signature is modified by globalize, causing a mismatch when Solidus inspects its parameters. For reference, see the globalize implementation here: https://github.com/globalize/globalize/blob/main/lib/patches/active_record/rails7_2/serialization.rb ## Solution To avoid conflicts, this PR replaces the method introspection with a Rails version check: ``` if Rails.gem_version >= Gem::Version.new('7.1') serialize :preferences, type: Hash, coder: YAML else serialize :preferences, Hash, coder: YAML end ``` This approach ensures compatibility while keeping Solidus independent from dependency-specific overrides. This issue is currently blocking the CI of the following PR in the solidus_globalize repository: https://github.com/solidusio-contrib/solidus_globalize/pull/153 Fixing this in Solidus will help unblock that PR. --- core/lib/spree/preferences/persistable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/spree/preferences/persistable.rb b/core/lib/spree/preferences/persistable.rb index 252f6e296ed..0d78ae2b01a 100644 --- a/core/lib/spree/preferences/persistable.rb +++ b/core/lib/spree/preferences/persistable.rb @@ -8,7 +8,7 @@ module Persistable included do include Spree::Preferences::Preferable - if method(:serialize).parameters.include?([:key, :type]) # Rails 7.1+ + if Rails.gem_version >= Gem::Version.new('7.1') serialize :preferences, type: Hash, coder: YAML else serialize :preferences, Hash, coder: YAML