diff --git a/activesupport/lib/active_support/messages/metadata.rb b/activesupport/lib/active_support/messages/metadata.rb index a10729a41df..33b81aa9fa0 100644 --- a/activesupport/lib/active_support/messages/metadata.rb +++ b/activesupport/lib/active_support/messages/metadata.rb @@ -82,7 +82,7 @@ module ActiveSupport throw :invalid_message_content, "expired" end - if hash["pur"] != purpose&.to_s + if hash["pur"].to_s != purpose.to_s throw :invalid_message_content, "mismatched purpose" end diff --git a/activesupport/test/messages/message_metadata_tests.rb b/activesupport/test/messages/message_metadata_tests.rb index b9158fc6de5..5cb2c6465af 100644 --- a/activesupport/test/messages/message_metadata_tests.rb +++ b/activesupport/test/messages/message_metadata_tests.rb @@ -92,6 +92,13 @@ module MessageMetadataTests assert_roundtrip "a string", codec, { purpose: "x", expires_in: 1.year }, { purpose: "x" } end + test "messages with non-string purpose are readable" do + each_scenario do |data, codec| + message = encode(data, codec, purpose: [ "x", 1 ]) + assert_equal data, decode(message, codec, purpose: [ "x", 1 ]) + end + end + test "messages are readable regardless of use_message_serializer_for_metadata" do each_scenario do |data, codec| message = encode(data, codec, purpose: "x")