Skip to content

Commit 62d2f90

Browse files
committed
Merge pull request #108 from coreypurcell/master
closes #105 adds a slug for uploaded programs
2 parents 22c84fe + a80b913 commit 62d2f90

3 files changed

Lines changed: 61 additions & 0 deletions

File tree

app/models/program.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff 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

lib/sluggifier.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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

spec/unit/sluggifier_spec.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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

0 commit comments

Comments
 (0)