Skip to content

Commit 5623f7f

Browse files
committed
Return a copy of the source string when transliterating
Co-authored-by: Adam Hess <[email protected]> Fixes an issue where parameterizing strings was mutating the source, eg: ```ruby require "bundler/inline" gemfile(true) do source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } gem "rails", github: "rails/rails", branch: "main" gem "sqlite3" end require "active_record" require "minitest/autorun" require "logger" ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::Schema.define do create_table :posts, force: true do |t| t.text :name t.text :slug end end class Post < ActiveRecord::Base validate :generate_slug def generate_slug self.slug = name.parameterize end end class BugTest < Minitest::Test def test_name_gets_corrupted post = Post.create!(name: "hi there") assert_equal "hi there", post.name # This test fails, "hi-there" end end ```
1 parent c6b227b commit 5623f7f

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

activesupport/lib/active_support/inflector/transliterate.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ def transliterate(string, replacement = "?", locale: nil)
6565
raise ArgumentError, "Can only transliterate strings. Received #{string.class.name}" unless string.is_a?(String)
6666
raise ArgumentError, "Cannot transliterate strings with #{string.encoding} encoding" unless ALLOWED_ENCODINGS_FOR_TRANSLITERATE.include?(string.encoding)
6767

68+
return string.dup if string.ascii_only?
6869
string = string.dup if string.frozen?
69-
return string if string.ascii_only?
7070

7171
input_encoding = string.encoding
7272

activesupport/test/transliterate_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,11 @@ def test_transliterate_handles_strings_with_invalid_gb18030_bytes
106106
string = String.new("\255", encoding: Encoding::GB18030).freeze
107107
assert_equal "?", ActiveSupport::Inflector.transliterate(string)
108108
end
109+
110+
def test_transliterate_returns_a_copy_of_ascii_strings
111+
string = "Test String".dup
112+
assert_not string.frozen?
113+
assert string.ascii_only?
114+
assert_not_equal string.object_id, ActiveSupport::Inflector.transliterate(string).object_id
115+
end
109116
end

0 commit comments

Comments
 (0)