From 491388946602a4f5d234e8977107ed5ce5c08705 Mon Sep 17 00:00:00 2001 From: Erik Ogan and Thomas Shafer Date: Mon, 27 Feb 2012 12:02:42 -0800 Subject: [PATCH] FriendlyId::SlugGenerator#wildcard must escape underscores. While we're at it, we should escape percent signs, too. Fixes Issue #240 --- lib/friendly_id/slug_generator.rb | 5 ++++- test/slugged_test.rb | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) 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