has_unique_slug 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +4 -0
- data/README.md +5 -0
- data/lib/has_unique_slug.rb +9 -2
- data/lib/has_unique_slug/version.rb +1 -1
- data/spec/has_unique_slug_spec.rb +31 -1
- data/spec/spec_helper.rb +1 -0
- metadata +12 -11
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -52,6 +52,11 @@ All the standard url helper methods will still work since `to_param` is overrid
|
|
52
52
|
post = Post.create! :title => "Sample Post"
|
53
53
|
post_path(post) # /posts/sample-post
|
54
54
|
|
55
|
+
|
56
|
+
## Gotchas
|
57
|
+
|
58
|
+
If you are adding this to an existing project that already contains records, perform the necessary setup then run something like `Post.all.each {|p| p.save }` in the rails console to populate the slug columns.
|
59
|
+
|
55
60
|
## TODO:
|
56
61
|
|
57
62
|
- Add support for scopes
|
data/lib/has_unique_slug.rb
CHANGED
@@ -16,9 +16,9 @@ module HasUniqueSlug
|
|
16
16
|
def has_unique_slug args = {}
|
17
17
|
|
18
18
|
# Setup default options
|
19
|
-
options = { :column => :slug, :subject => :title }
|
19
|
+
options = { :column => :slug, :subject => :title, :scope => nil }
|
20
20
|
options.merge! args
|
21
|
-
slug_column, subject_column = options[:column], options[:subject]
|
21
|
+
slug_column, subject_column, scope_column = options[:column], options[:subject], options[:scope]
|
22
22
|
|
23
23
|
# Use before_validates otherwise ActiveRecord uniqueness validations on the model will fail. Uniqueness is already guarneteed.
|
24
24
|
# It is not recommend to use a 'validates :slug, :uniqueness => true' validation because that will add unndeeded stress on the
|
@@ -31,6 +31,13 @@ module HasUniqueSlug
|
|
31
31
|
# Ensure the current slug is unique in the database, if not, make it unqiue
|
32
32
|
test_slug, i = slug_prefix, 1
|
33
33
|
record_scope = record.new_record? ? record.class.scoped : record.class.where("id != ?", record.id)
|
34
|
+
|
35
|
+
# Add scope to uniqueness call
|
36
|
+
unless scope_column.nil?
|
37
|
+
record_scope = record_scope.where("#{scope_column} = ?", record[scope_column])
|
38
|
+
end
|
39
|
+
|
40
|
+
# Test for uniqueness
|
34
41
|
while not record_scope.where("#{slug_column} = ?", test_slug).count.zero?
|
35
42
|
test_slug = "#{slug_prefix}-#{(i += 1)}"
|
36
43
|
end
|
@@ -8,6 +8,14 @@ class Standard < ActiveRecord::Base
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
class StandardWithScope < ActiveRecord::Base
|
12
|
+
has_unique_slug :scope => :some_scope
|
13
|
+
|
14
|
+
def self.table_name
|
15
|
+
"standard"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
11
19
|
class Custom < ActiveRecord::Base
|
12
20
|
has_unique_slug :column => :permalink, :subject => :name
|
13
21
|
|
@@ -34,12 +42,18 @@ describe HasUniqueSlug do
|
|
34
42
|
teardown_db
|
35
43
|
end
|
36
44
|
|
45
|
+
after(:each) do
|
46
|
+
Standard.destroy_all
|
47
|
+
Custom.destroy_all
|
48
|
+
end
|
49
|
+
|
37
50
|
it "creates a unique slug" do
|
38
51
|
r = Standard.create! :title => "Sample Record"
|
39
52
|
r.slug.should == "sample-record"
|
40
53
|
end
|
41
54
|
|
42
55
|
it "should add incremental column if not unique" do
|
56
|
+
Standard.create! :title => "Sample Record"
|
43
57
|
2.upto 5 do |i|
|
44
58
|
r = Standard.create! :title => "Sample Record"
|
45
59
|
r.slug.should == "sample-record-#{i}"
|
@@ -47,7 +61,7 @@ describe HasUniqueSlug do
|
|
47
61
|
end
|
48
62
|
|
49
63
|
it "should not increment the slug if the duplicate is itself" do
|
50
|
-
r = Standard.
|
64
|
+
r = Standard.create! :title => "Sample Record"
|
51
65
|
slug = r.slug
|
52
66
|
r.save.should be_true
|
53
67
|
r.slug.should == slug
|
@@ -79,4 +93,20 @@ describe HasUniqueSlug do
|
|
79
93
|
r.permalink.should == slug
|
80
94
|
end
|
81
95
|
|
96
|
+
it "should allow two slugs with the same value if scopes differ" do
|
97
|
+
r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
|
98
|
+
r.slug.should == "sample-record"
|
99
|
+
|
100
|
+
r = StandardWithScope.create! :title => "Sample Record", :some_scope => 2
|
101
|
+
r.slug.should == "sample-record"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should increment the slug if two records share the same scope" do
|
105
|
+
r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
|
106
|
+
r.slug.should == "sample-record"
|
107
|
+
|
108
|
+
r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
|
109
|
+
r.slug.should == "sample-record-2"
|
110
|
+
end
|
111
|
+
|
82
112
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_unique_slug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-28 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70256493008000 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70256493008000
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activerecord
|
27
|
-
requirement: &
|
27
|
+
requirement: &70256493007320 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70256493007320
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70256493006540 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70256493006540
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70256493005660 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70256493005660
|
58
58
|
description: Generates a unique slug for use as a drop-in replacement for ids.
|
59
59
|
email:
|
60
60
|
- brendan@unknowncollective.com
|
@@ -63,6 +63,7 @@ extensions: []
|
|
63
63
|
extra_rdoc_files: []
|
64
64
|
files:
|
65
65
|
- .gitignore
|
66
|
+
- .travis.yml
|
66
67
|
- Gemfile
|
67
68
|
- README.md
|
68
69
|
- Rakefile
|
@@ -85,7 +86,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
86
|
version: '0'
|
86
87
|
segments:
|
87
88
|
- 0
|
88
|
-
hash: -
|
89
|
+
hash: -4480308170059512738
|
89
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
91
|
none: false
|
91
92
|
requirements:
|
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
95
|
version: '0'
|
95
96
|
segments:
|
96
97
|
- 0
|
97
|
-
hash: -
|
98
|
+
hash: -4480308170059512738
|
98
99
|
requirements: []
|
99
100
|
rubyforge_project: has_unique_slug
|
100
101
|
rubygems_version: 1.8.10
|