Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/models/program.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@ class Program

scope :by_username, lambda { |username| where(:author_username => username) }

before_create :make_slug

def make_slug
unless slug
all_slugs = Program.where(:author_username => author_username).map(&:slug)
self.slug = Sluggifier.generate(title)
end
end

def to_param
slug
end
Expand Down
24 changes: 24 additions & 0 deletions lib/sluggifier.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
class Sluggifier
def self.generate(title, all_slugs=[])
slug = title.parameterize
while self.conflict?(slug,all_slugs)
slug = self.next(slug, all_slugs)
end
slug
end

def self.next(slug,all_slugs)
sequence = self.conflict(slug,all_slugs).split('-')[1].to_i
next_sequence = sequence == 0 ? 2 : sequence.next
"#{slug.gsub(/(\-\d+)/,'')}-#{next_sequence}"
end

def self.conflict?(slug,all_slugs)
!! self.conflict(slug,all_slugs)
end

def self.conflict(slug, all_slugs)
all_slugs.select { |s| s == slug }.first
end

end
28 changes: 28 additions & 0 deletions spec/unit/sluggifier_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# encoding: utf-8

require 'active_support/all'
require_relative '../../lib/sluggifier'

describe Sluggifier do
describe '.generate' do
it "makes a slug from a title" do
Sluggifier.generate('test a slug').should == 'test-a-slug'
end


context "doesn't allow multiple slugs to be the same" do
let(:all_slugs) { ['test'] }

it "appends a one if there is one repeated slug" do
Sluggifier.generate('test',all_slugs).should == 'test-2'
end

it "appends the next sequential number for repeats" do
all_slugs << 'test-2'
Sluggifier.generate('test',all_slugs).should == 'test-3'
end
end
end


end