File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -8,6 +8,15 @@ class Program
88
99 scope :by_username , lambda { |username | where ( :author_username => username ) }
1010
11+ before_create :make_slug
12+
13+ def make_slug
14+ unless slug
15+ all_slugs = Program . where ( :author_username => author_username ) . map ( &:slug )
16+ self . slug = Sluggifier . generate ( title )
17+ end
18+ end
19+
1120 def to_param
1221 slug
1322 end
Original file line number Diff line number Diff line change 1+ class Sluggifier
2+ def self . generate ( title , all_slugs = [ ] )
3+ slug = title . parameterize
4+ while self . conflict? ( slug , all_slugs )
5+ slug = self . next ( slug , all_slugs )
6+ end
7+ slug
8+ end
9+
10+ def self . next ( slug , all_slugs )
11+ sequence = self . conflict ( slug , all_slugs ) . split ( '-' ) [ 1 ] . to_i
12+ next_sequence = sequence == 0 ? 2 : sequence . next
13+ "#{ slug . gsub ( /(\- \d +)/ , '' ) } -#{ next_sequence } "
14+ end
15+
16+ def self . conflict? ( slug , all_slugs )
17+ !! self . conflict ( slug , all_slugs )
18+ end
19+
20+ def self . conflict ( slug , all_slugs )
21+ all_slugs . select { |s | s == slug } . first
22+ end
23+
24+ end
Original file line number Diff line number Diff line change 1+ # encoding: utf-8
2+
3+ require 'active_support/all'
4+ require_relative '../../lib/sluggifier'
5+
6+ describe Sluggifier do
7+ describe '.generate' do
8+ it "makes a slug from a title" do
9+ Sluggifier . generate ( 'test a slug' ) . should == 'test-a-slug'
10+ end
11+
12+
13+ context "doesn't allow multiple slugs to be the same" do
14+ let ( :all_slugs ) { [ 'test' ] }
15+
16+ it "appends a one if there is one repeated slug" do
17+ Sluggifier . generate ( 'test' , all_slugs ) . should == 'test-2'
18+ end
19+
20+ it "appends the next sequential number for repeats" do
21+ all_slugs << 'test-2'
22+ Sluggifier . generate ( 'test' , all_slugs ) . should == 'test-3'
23+ end
24+ end
25+ end
26+
27+
28+ end
You can’t perform that action at this time.
0 commit comments