mongoid_slug 0.4.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +3 -1
- data/lib/mongoid_slug.rb +12 -8
- data/spec/models/person.rb +6 -0
- data/spec/mongoid_slug_spec.rb +20 -7
- metadata +6 -4
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Mongoid Slug
|
2
2
|
|
3
|
-
This gem generates a URL slug/permalink based on fields in a Mongoid model.
|
3
|
+
This gem generates a URL slug/permalink based on a field or set of fields in a Mongoid model.
|
4
4
|
|
5
5
|
class Book
|
6
6
|
include Mongoid::Document
|
@@ -35,3 +35,5 @@ This gem generates a URL slug/permalink based on fields in a Mongoid model.
|
|
35
35
|
=> "félix-guattari"
|
36
36
|
>> book.authors.where(:slug => 'felix-guattari).first
|
37
37
|
=> #<Author _id: 4c31e362faa4a7050e000003, slug: "félix-guattari", last_name: "Guattari", first_name: "Félix">
|
38
|
+
|
39
|
+
Check out the sample models in the spec folder for more examples.
|
data/lib/mongoid_slug.rb
CHANGED
@@ -3,14 +3,18 @@ module Mongoid::Slug
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
cattr_accessor :slugged_fields
|
6
|
+
cattr_accessor :slug_name, :slugged_fields
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods #:nodoc:
|
10
10
|
# Set a field or a number of fields as source of slug
|
11
|
-
def slug(*
|
12
|
-
|
13
|
-
|
11
|
+
def slug(*args)
|
12
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
13
|
+
self.slug_name = options[:as] || :slug
|
14
|
+
self.slugged_fields = args
|
15
|
+
field slug_name
|
16
|
+
index slug_name, :unique => true
|
17
|
+
before_save :generate_slug
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
@@ -20,10 +24,10 @@ module Mongoid::Slug
|
|
20
24
|
|
21
25
|
private
|
22
26
|
|
23
|
-
def
|
27
|
+
def duplicate_of(slug, association_chain=[])
|
24
28
|
if embedded?
|
25
29
|
association_chain << association_name
|
26
|
-
_parent.send :
|
30
|
+
_parent.send :duplicate_of, slug, association_chain
|
27
31
|
else
|
28
32
|
association_chain.reverse! << "slug"
|
29
33
|
collection.find(association_chain.join(".") => slug)
|
@@ -33,7 +37,7 @@ module Mongoid::Slug
|
|
33
37
|
def find_unique_slug(suffix='')
|
34
38
|
slug = ("#{slug_base} #{suffix}").parameterize
|
35
39
|
|
36
|
-
if
|
40
|
+
if duplicate_of(slug).reject{ |doc| doc.id == self.id }.empty?
|
37
41
|
slug
|
38
42
|
else
|
39
43
|
suffix = suffix.blank? ? '1' : "#{suffix.to_i + 1}"
|
@@ -43,7 +47,7 @@ module Mongoid::Slug
|
|
43
47
|
|
44
48
|
def generate_slug
|
45
49
|
if new_record? || slugged_fields_changed?
|
46
|
-
self.
|
50
|
+
self.send("#{slug_name}=", find_unique_slug)
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
data/spec/mongoid_slug_spec.rb
CHANGED
@@ -193,7 +193,20 @@ describe Mongoid::Slug do
|
|
193
193
|
|
194
194
|
end
|
195
195
|
|
196
|
-
|
196
|
+
context ":as option" do
|
197
|
+
|
198
|
+
before(:each) do
|
199
|
+
@person = Person.create(:name => "John Doe")
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should set the slug field name" do
|
203
|
+
@person.respond_to?(:permalink).should be_true
|
204
|
+
@person.send(:permalink).should eql "john-doe"
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
context "#duplicate_of" do
|
197
210
|
|
198
211
|
before(:each) do
|
199
212
|
@foo = Foo.create(:name => "foo")
|
@@ -201,16 +214,16 @@ describe Mongoid::Slug do
|
|
201
214
|
@baz = @bar.bazes.create(:name => "baz")
|
202
215
|
end
|
203
216
|
|
204
|
-
it "
|
205
|
-
@foo.send(:
|
217
|
+
it "finds duplicate slug of a root document" do
|
218
|
+
@foo.send(:duplicate_of, @foo.slug).count.should eql 1
|
206
219
|
end
|
207
220
|
|
208
|
-
it "
|
209
|
-
@bar.send(:
|
221
|
+
it "finds duplicate slug of an embedded document" do
|
222
|
+
@bar.send(:duplicate_of, @bar.slug).count.should eql 1
|
210
223
|
end
|
211
224
|
|
212
|
-
it "
|
213
|
-
@baz.send(:
|
225
|
+
it "finds duplicate slug of a deeply-embedded document" do
|
226
|
+
@baz.send(:duplicate_of, @baz.slug).count.should eql 1
|
214
227
|
end
|
215
228
|
|
216
229
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_slug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 2
|
10
|
+
version: 0.4.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Hakan Ensari
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-07-
|
19
|
+
date: 2010-07-07 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- spec/models/baz.rb
|
55
55
|
- spec/models/book.rb
|
56
56
|
- spec/models/foo.rb
|
57
|
+
- spec/models/person.rb
|
57
58
|
- spec/models/publisher.rb
|
58
59
|
- spec/models/subject.rb
|
59
60
|
- spec/mongoid_slug_spec.rb
|
@@ -98,6 +99,7 @@ test_files:
|
|
98
99
|
- spec/models/baz.rb
|
99
100
|
- spec/models/book.rb
|
100
101
|
- spec/models/foo.rb
|
102
|
+
- spec/models/person.rb
|
101
103
|
- spec/models/publisher.rb
|
102
104
|
- spec/models/subject.rb
|
103
105
|
- spec/mongoid_slug_spec.rb
|