friendly_id 2.2.5 → 2.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/{MIT-LICENSE → LICENSE} +0 -0
- data/README.rdoc +5 -5
- data/Rakefile +31 -42
- data/extras/README.txt +3 -0
- data/extras/template-gem.rb +26 -0
- data/extras/template-plugin.rb +28 -0
- data/lib/friendly_id.rb +2 -2
- data/lib/friendly_id/non_sluggable_class_methods.rb +5 -4
- data/lib/friendly_id/sluggable_class_methods.rb +1 -1
- data/lib/friendly_id/sluggable_instance_methods.rb +34 -18
- data/lib/friendly_id/tasks.rb +2 -2
- data/lib/friendly_id/version.rb +1 -1
- data/test/cached_slug_test.rb +0 -3
- data/test/custom_slug_normalizer_test.rb +9 -11
- data/test/non_slugged_test.rb +5 -7
- data/test/scoped_model_test.rb +18 -10
- data/test/slug_test.rb +2 -3
- data/test/slugged_model_test.rb +39 -33
- data/test/sti_test.rb +2 -4
- data/test/support/database.yml.postgres +6 -0
- data/test/support/database.yml.sqlite3 +2 -0
- data/test/support/models.rb +45 -0
- data/test/tasks_test.rb +5 -6
- data/test/test_helper.rb +85 -19
- metadata +23 -50
- data/test/contest.rb +0 -94
- data/test/models/book.rb +0 -2
- data/test/models/city.rb +0 -4
- data/test/models/country.rb +0 -4
- data/test/models/district.rb +0 -3
- data/test/models/event.rb +0 -3
- data/test/models/legacy_thing.rb +0 -4
- data/test/models/novel.rb +0 -3
- data/test/models/person.rb +0 -6
- data/test/models/post.rb +0 -6
- data/test/models/thing.rb +0 -6
- data/test/models/user.rb +0 -3
- data/test/schema.rb +0 -70
data/test/scoped_model_test.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require File.dirname(__FILE__) + '/test_helper'
|
4
2
|
|
3
|
+
|
5
4
|
class ScopedModelTest < Test::Unit::TestCase
|
6
5
|
|
7
6
|
context "A slugged model that uses a scope" do
|
@@ -9,33 +8,42 @@ class ScopedModelTest < Test::Unit::TestCase
|
|
9
8
|
setup do
|
10
9
|
@usa = Country.create!(:name => "USA")
|
11
10
|
@canada = Country.create!(:name => "Canada")
|
12
|
-
@
|
13
|
-
@
|
11
|
+
@resident = Resident.create!(:name => "John Smith", :country => @usa)
|
12
|
+
@resident2 = Resident.create!(:name => "John Smith", :country => @canada)
|
14
13
|
end
|
15
14
|
|
16
15
|
teardown do
|
17
|
-
|
16
|
+
Resident.delete_all
|
18
17
|
Country.delete_all
|
19
18
|
Slug.delete_all
|
20
19
|
end
|
21
20
|
|
21
|
+
should "should not show the scope in the friendly_id" do
|
22
|
+
assert_equal "john-smith", @resident.friendly_id
|
23
|
+
assert_equal "john-smith", @resident2.friendly_id
|
24
|
+
end
|
25
|
+
|
22
26
|
should "find all scoped records without scope" do
|
23
|
-
assert_equal 2,
|
27
|
+
assert_equal 2, Resident.find(:all, @resident.friendly_id).size
|
28
|
+
end
|
29
|
+
|
30
|
+
should "find a single scoped records with a scope as a string" do
|
31
|
+
assert Resident.find(@resident.friendly_id, :scope => @resident.country.to_param)
|
24
32
|
end
|
25
33
|
|
26
34
|
should "find a single scoped records with a scope" do
|
27
|
-
assert
|
35
|
+
assert Resident.find(@resident.friendly_id, :scope => @resident.country)
|
28
36
|
end
|
29
37
|
|
30
38
|
should "raise an error when finding a single scoped record with no scope" do
|
31
39
|
assert_raises ActiveRecord::RecordNotFound do
|
32
|
-
|
40
|
+
Resident.find(@resident.friendly_id)
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
36
44
|
should "append scope error info when missing scope causes a find to fail" do
|
37
45
|
begin
|
38
|
-
|
46
|
+
Resident.find(@resident.friendly_id)
|
39
47
|
fail "The find should not have succeeded"
|
40
48
|
rescue ActiveRecord::RecordNotFound => e
|
41
49
|
assert_match /expected scope/, e.message
|
@@ -44,7 +52,7 @@ class ScopedModelTest < Test::Unit::TestCase
|
|
44
52
|
|
45
53
|
should "append scope error info when the scope value causes a find to fail" do
|
46
54
|
begin
|
47
|
-
|
55
|
+
Resident.find(@resident.friendly_id, :scope => "badscope")
|
48
56
|
fail "The find should not have succeeded"
|
49
57
|
rescue ActiveRecord::RecordNotFound => e
|
50
58
|
assert_match /scope=badscope/, e.message
|
data/test/slug_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require File.dirname(__FILE__) + '/test_helper'
|
4
3
|
|
5
4
|
class SlugTest < Test::Unit::TestCase
|
@@ -12,8 +11,8 @@ class SlugTest < Test::Unit::TestCase
|
|
12
11
|
end
|
13
12
|
|
14
13
|
should "indicate if it is the most recent slug" do
|
15
|
-
post = Post.create!(:
|
16
|
-
post.
|
14
|
+
post = Post.create!(:name => "test title")
|
15
|
+
post.name = "a new title"
|
17
16
|
post.save!
|
18
17
|
assert post.slugs.last.is_most_recent?
|
19
18
|
assert !post.slugs.first.is_most_recent?
|
data/test/slugged_model_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require File.dirname(__FILE__) + '/test_helper'
|
4
3
|
|
5
4
|
class SluggedModelTest < Test::Unit::TestCase
|
@@ -7,17 +6,16 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
7
6
|
context "A slugged model with default FriendlyId options" do
|
8
7
|
|
9
8
|
setup do
|
10
|
-
Post.friendly_id_options = FriendlyId::DEFAULT_OPTIONS.merge(:method => :
|
11
|
-
@post = Post.new :
|
9
|
+
Post.friendly_id_options = FriendlyId::DEFAULT_OPTIONS.merge(:method => :name, :use_slug => true)
|
10
|
+
@post = Post.new :name => "Test post", :published => true
|
12
11
|
@post.save!
|
13
12
|
end
|
14
13
|
|
15
14
|
teardown do
|
16
15
|
Post.delete_all
|
17
16
|
Person.delete_all
|
17
|
+
Place.delete_all
|
18
18
|
Slug.delete_all
|
19
|
-
Thing.delete_all
|
20
|
-
LegacyThing.delete_all
|
21
19
|
end
|
22
20
|
|
23
21
|
should "have friendly_id options" do
|
@@ -51,7 +49,7 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
51
49
|
end
|
52
50
|
|
53
51
|
should "generate slug text" do
|
54
|
-
post = Post.new :
|
52
|
+
post = Post.new :name => "Test post"
|
55
53
|
assert_not_nil post.slug_text
|
56
54
|
end
|
57
55
|
|
@@ -63,36 +61,36 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
63
61
|
|
64
62
|
should "raise an error if the friendly_id text is reserved" do
|
65
63
|
assert_raises(FriendlyId::SlugGenerationError) do
|
66
|
-
Post.create!(:
|
64
|
+
Post.create!(:name => "new")
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
70
68
|
should "raise an error if the friendly_id text is an empty string" do
|
71
69
|
assert_raises(FriendlyId::SlugGenerationError) do
|
72
|
-
Post.create(:
|
70
|
+
Post.create(:name => "")
|
73
71
|
end
|
74
72
|
end
|
75
73
|
|
76
74
|
should "raise an error if the friendly_id text is nil" do
|
77
75
|
assert_raises(FriendlyId::SlugGenerationError) do
|
78
|
-
Post.create(:
|
76
|
+
Post.create(:name => nil)
|
79
77
|
end
|
80
78
|
end
|
81
79
|
|
82
80
|
should "raise an error if the normalized friendly id becomes blank" do
|
83
81
|
assert_raises(FriendlyId::SlugGenerationError) do
|
84
|
-
post = Post.create!(:
|
82
|
+
post = Post.create!(:name => "-.-")
|
85
83
|
end
|
86
84
|
end
|
87
85
|
|
88
86
|
should "not make a new slug unless the friendly_id method value has changed" do
|
89
|
-
@post.
|
87
|
+
@post.published = !@post.published
|
90
88
|
@post.save!
|
91
89
|
assert_equal 1, @post.slugs.size
|
92
90
|
end
|
93
91
|
|
94
92
|
should "make a new slug if the friendly_id method value has changed" do
|
95
|
-
@post.
|
93
|
+
@post.name = "Changed title"
|
96
94
|
@post.save!
|
97
95
|
assert_equal 2, @post.slugs.size
|
98
96
|
end
|
@@ -102,12 +100,12 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
102
100
|
end
|
103
101
|
|
104
102
|
should "increment sequence for duplicate slug names" do
|
105
|
-
@post2 = Post.create! :
|
103
|
+
@post2 = Post.create! :name => @post.name
|
106
104
|
assert_equal 2, @post2.slug.sequence
|
107
105
|
end
|
108
106
|
|
109
107
|
should "have a friendly_id that terminates with -- and the slug sequence if the sequence is greater than 1" do
|
110
|
-
@post2 = Post.create! :
|
108
|
+
@post2 = Post.create! :name => @post.name
|
111
109
|
assert_match(/--2\z/, @post2.friendly_id)
|
112
110
|
end
|
113
111
|
|
@@ -116,36 +114,36 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
116
114
|
end
|
117
115
|
|
118
116
|
should "not strip diacritics" do
|
119
|
-
post = Post.new(:
|
117
|
+
post = Post.new(:name => "¡Feliz año!")
|
120
118
|
assert_match(/#{'ñ'}/, post.slug_text)
|
121
119
|
end
|
122
120
|
|
123
121
|
should "not convert to ASCII" do
|
124
|
-
post = Post.new(:
|
122
|
+
post = Post.new(:name => "katakana: ゲコゴサザシジ")
|
125
123
|
assert_equal "katakana-ゲコゴサザシジ", post.slug_text
|
126
124
|
end
|
127
125
|
|
128
126
|
should "allow the same friendly_id across models" do
|
129
|
-
|
130
|
-
assert_equal
|
127
|
+
district = District.create!(:name => @post.name)
|
128
|
+
assert_equal district.friendly_id, @post.friendly_id
|
131
129
|
end
|
132
130
|
|
133
131
|
should "truncate slug text longer than the max length" do
|
134
|
-
post = Post.new(:
|
132
|
+
post = Post.new(:name => "a" * (Post.friendly_id_options[:max_length] + 1))
|
135
133
|
assert_equal post.slug_text.length, Post.friendly_id_options[:max_length]
|
136
134
|
end
|
137
135
|
|
138
136
|
should "truncate slug in 'right way' when slug is unicode" do
|
139
|
-
post = Post.new(:
|
137
|
+
post = Post.new(:name => "ё" * 100 + 'ю' *(Post.friendly_id_options[:max_length] - 100 + 1))
|
140
138
|
assert_equal post.slug_text.mb_chars[-1], 'ю'
|
141
139
|
end
|
142
140
|
|
143
141
|
should "be able to reuse an old friendly_id without incrementing the sequence" do
|
144
|
-
old_title = @post.
|
142
|
+
old_title = @post.name
|
145
143
|
old_friendly_id = @post.friendly_id
|
146
|
-
@post.
|
144
|
+
@post.name = "A changed title"
|
147
145
|
@post.save!
|
148
|
-
@post.
|
146
|
+
@post.name = old_title
|
149
147
|
@post.save!
|
150
148
|
assert_equal old_friendly_id, @post.friendly_id
|
151
149
|
end
|
@@ -158,8 +156,8 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
158
156
|
|
159
157
|
# This emulates a fairly common issue where id's generated by fixtures are very high.
|
160
158
|
should "continue to admit very large ids" do
|
161
|
-
|
162
|
-
assert
|
159
|
+
Person.connection.execute("INSERT INTO people (id, name) VALUES (2147483647, 'Joe Schmoe')")
|
160
|
+
assert Person.find(2147483647)
|
163
161
|
end
|
164
162
|
|
165
163
|
context "and configured to strip diacritics" do
|
@@ -168,19 +166,19 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
168
166
|
end
|
169
167
|
|
170
168
|
should "strip diacritics from Roman alphabet based characters" do
|
171
|
-
post = Post.new(:
|
169
|
+
post = Post.new(:name => "¡Feliz año!")
|
172
170
|
assert_no_match(/#{'ñ'}/, post.slug_text)
|
173
171
|
end
|
174
172
|
|
175
173
|
should "raise an error if the friendly_id text is an empty string" do
|
176
174
|
assert_raises(FriendlyId::SlugGenerationError) do
|
177
|
-
Post.create(:
|
175
|
+
Post.create(:name => "")
|
178
176
|
end
|
179
177
|
end
|
180
178
|
|
181
179
|
should "raise an error if the friendly_id text is nil" do
|
182
180
|
assert_raises(FriendlyId::SlugGenerationError) do
|
183
|
-
Post.create(:
|
181
|
+
Post.create(:name => nil)
|
184
182
|
end
|
185
183
|
end
|
186
184
|
|
@@ -192,14 +190,14 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
192
190
|
end
|
193
191
|
|
194
192
|
should "strip non-ascii characters" do
|
195
|
-
post = Post.new(:
|
193
|
+
post = Post.new(:name => "katakana: ゲコゴサザシジ")
|
196
194
|
assert_equal "katakana", post.slug_text
|
197
195
|
end
|
198
196
|
end
|
199
197
|
|
200
198
|
context "that uses a custom table name" do
|
201
199
|
should "support normal CRUD operations" do
|
202
|
-
assert thing =
|
200
|
+
assert thing = Place.create!(:name => "a name")
|
203
201
|
thing.name = "a new name"
|
204
202
|
assert thing.save!
|
205
203
|
assert thing.destroy
|
@@ -268,7 +266,7 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
268
266
|
context "when found using an outdated friendly id" do
|
269
267
|
setup do
|
270
268
|
old_id = @post.friendly_id
|
271
|
-
@post.
|
269
|
+
@post.name = "Title changed"
|
272
270
|
@post.save!
|
273
271
|
@post = Post.find(old_id)
|
274
272
|
end
|
@@ -291,10 +289,18 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
291
289
|
|
292
290
|
end
|
293
291
|
|
292
|
+
context "when table does not exist" do
|
293
|
+
should "not raise an error when doing friendly_id setup" do
|
294
|
+
assert_nothing_raised do
|
295
|
+
Question.has_friendly_id :title, :use_slug => true
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
294
300
|
context "when using an array as the find argument" do
|
295
301
|
|
296
302
|
setup do
|
297
|
-
@post2 = Post.create!(:
|
303
|
+
@post2 = Post.create!(:name => "another post", :published => true)
|
298
304
|
end
|
299
305
|
|
300
306
|
should "return results when passed an array of non-friendly ids" do
|
@@ -314,7 +320,7 @@ class SluggedModelTest < Test::Unit::TestCase
|
|
314
320
|
end
|
315
321
|
|
316
322
|
should "return results when passed an array of non-friendly ids, of which one represents a record with multiple slugs" do
|
317
|
-
@post2.update_attributes(:
|
323
|
+
@post2.update_attributes(:name => 'another post [updated]')
|
318
324
|
assert_equal 2, Post.find([@post.id, @post2.id]).size
|
319
325
|
end
|
320
326
|
|
data/test/sti_test.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require File.dirname(__FILE__) + '/test_helper'
|
4
2
|
|
5
3
|
class STIModelTest < Test::Unit::TestCase
|
@@ -7,8 +5,8 @@ class STIModelTest < Test::Unit::TestCase
|
|
7
5
|
context "A slugged model using single table inheritance" do
|
8
6
|
|
9
7
|
setup do
|
10
|
-
Novel.friendly_id_options = FriendlyId::DEFAULT_OPTIONS.merge(:method => :
|
11
|
-
@novel = Novel.new :
|
8
|
+
Novel.friendly_id_options = FriendlyId::DEFAULT_OPTIONS.merge(:method => :name, :use_slug => true)
|
9
|
+
@novel = Novel.new :name => "Test novel"
|
12
10
|
@novel.save!
|
13
11
|
end
|
14
12
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class CreateSupportModels < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :books do |t|
|
4
|
+
t.string :name
|
5
|
+
t.string :type
|
6
|
+
end
|
7
|
+
create_table :cities do |t|
|
8
|
+
t.string :name
|
9
|
+
t.string :my_slug
|
10
|
+
t.integer :population
|
11
|
+
end
|
12
|
+
create_table :countries do |t|
|
13
|
+
t.string :name
|
14
|
+
end
|
15
|
+
create_table :districts do |t|
|
16
|
+
t.string :name
|
17
|
+
t.string :cached_slug
|
18
|
+
end
|
19
|
+
create_table :events do |t|
|
20
|
+
t.string :name
|
21
|
+
t.datetime :event_date
|
22
|
+
end
|
23
|
+
create_table :legacy_table do |t|
|
24
|
+
t.string :name
|
25
|
+
end
|
26
|
+
create_table :people do |t|
|
27
|
+
t.string :name
|
28
|
+
end
|
29
|
+
create_table :posts do |t|
|
30
|
+
t.string :name
|
31
|
+
t.boolean :published
|
32
|
+
end
|
33
|
+
create_table :residents do |t|
|
34
|
+
t.string :name
|
35
|
+
t.integer :country_id
|
36
|
+
end
|
37
|
+
create_table :users do |t|
|
38
|
+
t.string :name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.down
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/test/tasks_test.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
require "friendly_id/tasks"
|
3
|
-
require "mocha"
|
4
3
|
|
5
4
|
class TasksTest < Test::Unit::TestCase
|
6
5
|
|
@@ -42,7 +41,7 @@ class TasksTest < Test::Unit::TestCase
|
|
42
41
|
context "The 'delete_slugs_for' task" do
|
43
42
|
|
44
43
|
setup do
|
45
|
-
@post = Post.create! :
|
44
|
+
@post = Post.create! :name => "Slugs Considered Harmful"
|
46
45
|
@city = City.create! :name => "Buenos Aires"
|
47
46
|
end
|
48
47
|
|
@@ -59,9 +58,9 @@ class TasksTest < Test::Unit::TestCase
|
|
59
58
|
end
|
60
59
|
|
61
60
|
should "set the cached_slug column to NULL" do
|
62
|
-
|
63
|
-
|
64
|
-
assert_nil
|
61
|
+
District.create! :name => "Garment"
|
62
|
+
FriendlyId::Tasks.delete_slugs_for("District")
|
63
|
+
assert_nil District.first.cached_slug
|
65
64
|
end
|
66
65
|
|
67
66
|
end
|
@@ -69,7 +68,7 @@ class TasksTest < Test::Unit::TestCase
|
|
69
68
|
context "The 'delete_old_slugs' task" do
|
70
69
|
|
71
70
|
setup do
|
72
|
-
@post = Post.create! :
|
71
|
+
@post = Post.create! :name => "Slugs Considered Harmful"
|
73
72
|
@city = City.create! :name => "Buenos Aires"
|
74
73
|
City.connection.execute "UPDATE slugs SET created_at = '%s' WHERE id = %d" % [
|
75
74
|
45.days.ago.strftime("%Y-%m-%d"), @city.slug.id]
|
data/test/test_helper.rb
CHANGED
@@ -1,38 +1,104 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
4
2
|
$:.unshift(File.dirname(__FILE__))
|
3
|
+
|
5
4
|
$KCODE = 'UTF8' if RUBY_VERSION < '1.9'
|
6
5
|
$VERBOSE = false
|
6
|
+
|
7
|
+
require 'rubygems'
|
7
8
|
require 'test/unit'
|
8
9
|
require 'contest'
|
9
|
-
|
10
|
+
require 'mocha'
|
11
|
+
|
12
|
+
# You can use "rake test AR_VERSION=2.2.3" to test against 2.2.3 for example.
|
10
13
|
# The default is to use the latest installed ActiveRecord.
|
11
14
|
if ENV["AR_VERSION"]
|
12
15
|
gem 'activerecord', "#{ENV["AR_VERSION"]}"
|
13
16
|
gem 'activesupport', "#{ENV["AR_VERSION"]}"
|
14
17
|
end
|
18
|
+
|
15
19
|
require 'active_record'
|
16
20
|
require 'active_support'
|
21
|
+
require 'friendly_id'
|
22
|
+
require File.dirname(__FILE__) + '/../generators/friendly_id/templates/create_slugs'
|
23
|
+
require File.dirname(__FILE__) + '/support/models'
|
17
24
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
25
|
+
local_db_settings = File.dirname(__FILE__) + '/support/database.yml'
|
26
|
+
default_db_settings = File.dirname(__FILE__) + '/support/database.yml.sqlite3'
|
27
|
+
db_settings = File.exists?(local_db_settings) ? local_db_settings : default_db_settings
|
28
|
+
ActiveRecord::Base.establish_connection(YAML::load(File.open(db_settings)))
|
22
29
|
|
23
30
|
class ActiveRecord::Base
|
24
31
|
def log_protected_attribute_removal(*args) end
|
25
32
|
end
|
26
33
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
35
|
+
ActiveRecord::Base.connection.drop_table(table)
|
36
|
+
end
|
37
|
+
ActiveRecord::Migration.verbose = false
|
38
|
+
CreateSlugs.up
|
39
|
+
CreateSupportModels.up
|
40
|
+
|
41
|
+
# A model that uses the automagically configured "cached_slug" column
|
42
|
+
class District < ActiveRecord::Base
|
43
|
+
has_friendly_id :name, :use_slug => true
|
44
|
+
end
|
45
|
+
|
46
|
+
# A model that specifies a custom cached slug column
|
47
|
+
class City < ActiveRecord::Base
|
48
|
+
attr_accessible :name
|
49
|
+
has_friendly_id :name, :use_slug => true, :cache_column => 'my_slug'
|
50
|
+
end
|
51
|
+
|
52
|
+
# A model with a custom slug text normalizer
|
53
|
+
class Person < ActiveRecord::Base
|
54
|
+
has_friendly_id :name, :use_slug => true do |text|
|
55
|
+
text.upcase
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# A slugged model that uses a scope
|
60
|
+
class Resident < ActiveRecord::Base
|
61
|
+
belongs_to :country
|
62
|
+
has_friendly_id :name, :use_slug => true, :scope => :country
|
63
|
+
end
|
64
|
+
|
65
|
+
# A model used as a scope
|
66
|
+
class Country < ActiveRecord::Base
|
67
|
+
has_many :people
|
68
|
+
has_friendly_id :name, :use_slug => true
|
69
|
+
end
|
70
|
+
|
71
|
+
# A model that doesn't use slugs
|
72
|
+
class User < ActiveRecord::Base
|
73
|
+
has_friendly_id :name
|
74
|
+
end
|
75
|
+
|
76
|
+
# A model that uses default slug settings and has a named scope
|
77
|
+
class Post < ActiveRecord::Base
|
78
|
+
has_friendly_id :name, :use_slug => true
|
79
|
+
named_scope :published, :conditions => { :published => true }
|
80
|
+
end
|
81
|
+
|
82
|
+
# Model that uses a custom table name
|
83
|
+
class Place < ActiveRecord::Base
|
84
|
+
self.table_name = "legacy_table"
|
85
|
+
has_friendly_id :name, :use_slug => true
|
86
|
+
end
|
87
|
+
|
88
|
+
# A model that uses a datetime field for its friendly_id
|
89
|
+
class Event < ActiveRecord::Base
|
90
|
+
has_friendly_id :event_date, :use_slug => true
|
91
|
+
end
|
92
|
+
|
93
|
+
# A base model for single table inheritence
|
94
|
+
class Book < ActiveRecord::Base ; end
|
95
|
+
|
96
|
+
# A model that uses STI
|
97
|
+
class Novel < ::Book
|
98
|
+
has_friendly_id :name, :use_slug => true
|
99
|
+
end
|
100
|
+
|
101
|
+
# A model with no table
|
102
|
+
class Question < ActiveRecord::Base
|
103
|
+
has_friendly_id :name, :use_slug => true
|
104
|
+
end
|