diff --git a/lib/friendly_id/slug_generator.rb b/lib/friendly_id/slug_generator.rb index 5bc37753e..5068c0a42 100644 --- a/lib/friendly_id/slug_generator.rb +++ b/lib/friendly_id/slug_generator.rb @@ -65,7 +65,10 @@ def separator end def wildcard - "#{normalized}#{separator}%" + # Underscores (matching a single character) and percent signs (matching + # any number of characters) need to be escaped + # (While this seems like an excessive number of backslashes, it is correct) + "#{normalized}#{separator}".gsub(/[_%]/, '\\\\\&') + '%' end end end diff --git a/test/slugged_test.rb b/test/slugged_test.rb index 9f7f9749d..3fd3ac8f3 100644 --- a/test/slugged_test.rb +++ b/test/slugged_test.rb @@ -10,6 +10,15 @@ class Article < ActiveRecord::Base friendly_id :name, :use => :slugged end +class Novelist < ActiveRecord::Base + extend FriendlyId + friendly_id :name, :use => :slugged, :sequence_separator => '_' + + def normalize_friendly_id(string) + super.gsub("-", "_") + end +end + class SluggedTest < MiniTest::Unit::TestCase include FriendlyId::Test @@ -112,6 +121,14 @@ def model_class end end + test "should correctly sequence slugs with underscores" do + transaction do + record1 = Novelist.create! :name => 'wordsfail, buildings tumble' + record2 = Novelist.create! :name => 'word fail' + assert_equal 'word_fail', record2.slug + end + end + end class SlugSeparatorTest < MiniTest::Unit::TestCase