friendly_id 5.2.3 → 5.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +18 -1
- data/Changelog.md +13 -1
- data/README.md +46 -159
- data/UPGRADING.md +115 -0
- data/friendly_id.gemspec +1 -1
- data/gemfiles/Gemfile.rails-4.0.rb +1 -1
- data/gemfiles/Gemfile.rails-4.1.rb +1 -1
- data/gemfiles/Gemfile.rails-4.2.rb +2 -2
- data/gemfiles/Gemfile.rails-5.0.rb +2 -2
- data/gemfiles/Gemfile.rails-5.1.rb +27 -0
- data/gemfiles/Gemfile.rails-5.2.rb +27 -0
- data/lib/friendly_id/candidates.rb +0 -2
- data/lib/friendly_id/finder_methods.rb +2 -2
- data/lib/friendly_id/history.rb +3 -4
- data/lib/friendly_id/initializer.rb +11 -0
- data/lib/friendly_id/migration.rb +8 -1
- data/lib/friendly_id/object_utils.rb +9 -2
- data/lib/friendly_id/sequentially_slugged.rb +1 -1
- data/lib/friendly_id/slug.rb +4 -0
- data/lib/friendly_id/version.rb +1 -1
- data/test/helper.rb +4 -0
- data/test/history_test.rb +34 -3
- data/test/object_utils_test.rb +2 -0
- data/test/schema.rb +19 -2
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19856ab4f2e02ba7eed649beef7728be7eae0a58
|
4
|
+
data.tar.gz: bcf94acb37ff90b70916a96a34a2035570490128
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41b11ab959bcf15522a627431421bdb4542fd8768ee1695d6bf68d2351f479c4cd49e6f42e9b46a8f6aac0557bf199b8ad58582c02b049624204e12283740643
|
7
|
+
data.tar.gz: 221d38007de3e624191d6905bd0430dc90bce1a9b1212cc20e8bb9bfbd06aa60fc8e0e44c74ec52b9d424210806683ed39446bd623eae09cc07d0542f58db0e6
|
data/.travis.yml
CHANGED
@@ -6,7 +6,7 @@ rvm:
|
|
6
6
|
- 2.3.0
|
7
7
|
- 2.2.0
|
8
8
|
- 2.1.0
|
9
|
-
- jruby-9.
|
9
|
+
- jruby-9.1.13.0
|
10
10
|
|
11
11
|
env:
|
12
12
|
- DB=postgres
|
@@ -17,12 +17,24 @@ gemfile:
|
|
17
17
|
- gemfiles/Gemfile.rails-4.1.rb
|
18
18
|
- gemfiles/Gemfile.rails-4.2.rb
|
19
19
|
- gemfiles/Gemfile.rails-5.0.rb
|
20
|
+
- gemfiles/Gemfile.rails-5.1.rb
|
21
|
+
- gemfiles/Gemfile.rails-5.2.rb
|
20
22
|
|
21
23
|
before_install:
|
22
24
|
- gem update bundler
|
23
25
|
|
24
26
|
matrix:
|
25
27
|
exclude:
|
28
|
+
- rvm: 2.1.0
|
29
|
+
gemfile: gemfiles/Gemfile.rails-5.2.rb
|
30
|
+
- rvm: 2.2.0
|
31
|
+
gemfile: gemfiles/Gemfile.rails-5.2.rb
|
32
|
+
- rvm: jruby-9.1.13.0
|
33
|
+
gemfile: gemfiles/Gemfile.rails-5.2.rb
|
34
|
+
- rvm: 2.1.0
|
35
|
+
gemfile: gemfiles/Gemfile.rails-5.1.rb
|
36
|
+
- rvm: 2.2.0
|
37
|
+
gemfile: gemfiles/Gemfile.rails-5.1.rb
|
26
38
|
- rvm: 2.1.0
|
27
39
|
gemfile: gemfiles/Gemfile.rails-5.0.rb
|
28
40
|
- rvm: 2.2.0
|
@@ -31,6 +43,11 @@ matrix:
|
|
31
43
|
gemfile: gemfiles/Gemfile.rails-4.0.rb
|
32
44
|
- rvm: 2.4.0
|
33
45
|
gemfile: gemfiles/Gemfile.rails-4.1.rb
|
46
|
+
allow_failures:
|
47
|
+
- rvm: jruby-9.1.13.0
|
48
|
+
gemfile: gemfiles/Gemfile.rails-5.1.rb
|
49
|
+
- rvm: jruby-9.1.13.0
|
50
|
+
gemfile: gemfiles/Gemfile.rails-5.0.rb
|
34
51
|
|
35
52
|
sudo: false
|
36
53
|
|
data/Changelog.md
CHANGED
@@ -3,6 +3,18 @@
|
|
3
3
|
We would like to think our many [contributors](https://github.com/norman/friendly_id/graphs/contributors) for
|
4
4
|
suggestions, ideas and improvements to FriendlyId.
|
5
5
|
|
6
|
+
## 5.2.4 (2018-04-24)
|
7
|
+
|
8
|
+
* Fix compatibility with Rails versions 4.0 -> 5.2. ([#863](https://github.com/norman/friendly_id/pull/863)).
|
9
|
+
* Refactor `History::FinderMethods` to use base implementation. ([#853](https://github.com/norman/friendly_id/pull/853)).
|
10
|
+
* Defer loading of ActiveRecord to avoid config issues. ([#852](https://github.com/norman/friendly_id/pull/852)).
|
11
|
+
* Ensure compatibility with paranoid deletion libraries. ([#838](https://github.com/norman/friendly_id/pull/838)).
|
12
|
+
* Add treat_reserved_as_conflict option to initializer ([#847](https://github.com/norman/friendly_id/pull/847)).
|
13
|
+
|
14
|
+
## 5.2.3 (2017-09-22)
|
15
|
+
|
16
|
+
* Added option to treat reserved words as conflicts ([#831](https://github.com/norman/friendly_id/pull/831)).
|
17
|
+
|
6
18
|
## 5.2.2 (2017-09-13)
|
7
19
|
|
8
20
|
* Prevent warning on db:migrate in Rails 5.1 ([#826](https://github.com/norman/friendly_id/pull/826)).
|
@@ -24,7 +36,7 @@ suggestions, ideas and improvements to FriendlyId.
|
|
24
36
|
* Don't calculate all changes just to check if the param field has changed ([#667](https://github.com/norman/friendly_id/pull/667)).
|
25
37
|
* Don't set or change slug when unrelated validation failures block the record from being saved ([#642](https://github.com/norman/friendly_id/issues/642)).
|
26
38
|
* Fix order dependence bug between history and finders modules ([#718](https://github.com/norman/friendly_id/pull/718))
|
27
|
-
* Added ability to conditionally turn off
|
39
|
+
* Added ability to conditionally turn off `:dependent => :destroy` on FriendlyId::Slugs([#724](https://github.com/norman/friendly_id/pull/724))
|
28
40
|
* Add support for Rails 5. ([#728](https://github.com/norman/friendly_id/pull/728))
|
29
41
|
* Allow per-model conditional disabling of friendly path generation using a :routes option to friendly_id ([#735](https://github.com/norman/friendly_id/pull/735))
|
30
42
|
|
data/README.md
CHANGED
@@ -2,18 +2,6 @@
|
|
2
2
|
[![Code Climate](https://codeclimate.com/github/norman/friendly_id.svg)](https://codeclimate.com/github/norman/friendly_id)
|
3
3
|
[![Inline docs](http://inch-ci.org/github/norman/friendly_id.svg?branch=master)](http://inch-ci.org/github/norman/friendly_id)
|
4
4
|
|
5
|
-
**GETTING HELP**
|
6
|
-
|
7
|
-
Please ask questions on [Stack
|
8
|
-
Overflow](http://stackoverflow.com/questions/tagged/friendly-id) using the
|
9
|
-
"friendly-id" tag. Prior to asking, search and see if your question has
|
10
|
-
already been answered.
|
11
|
-
|
12
|
-
Please only post issues in Github issues for actual bugs.
|
13
|
-
|
14
|
-
I am asking people to do this because the same questions keep getting asked
|
15
|
-
over and over and over again in the issues.
|
16
|
-
|
17
5
|
# FriendlyId
|
18
6
|
|
19
7
|
**For the most complete, user-friendly documentation, see the [FriendlyId Guide](http://norman.github.io/friendly_id/file.Guide.html).**
|
@@ -31,185 +19,84 @@ instead of:
|
|
31
19
|
http://example.com/states/4323454
|
32
20
|
|
33
21
|
|
34
|
-
##
|
35
|
-
|
36
|
-
FriendlyId offers many advanced features, including: slug history and
|
37
|
-
versioning, i18n, scoped slugs, reserved words, and custom slug generators.
|
38
|
-
|
39
|
-
### What Changed in Version 5.1
|
40
|
-
|
41
|
-
5.1 is a bugfix release, but bumps the minor version because some applications may be dependent
|
42
|
-
on the previously buggy behavior. The changes include:
|
43
|
-
|
44
|
-
* Blank strings can no longer be used as slugs.
|
45
|
-
* When the first slug candidate is rejected because it is reserved, additional candidates will
|
46
|
-
now be considered before marking the record as invalid.
|
47
|
-
* The `:finders` module is now compatible with Rails 4.2.
|
48
|
-
|
49
|
-
### What Changed in Version 5.0
|
50
|
-
|
51
|
-
As of version 5.0, FriendlyId uses [semantic versioning](http://semver.org/). Therefore, as you might
|
52
|
-
infer from the version number, 5.0 introduces changes incompatible with 4.0.
|
53
|
-
|
54
|
-
The most important changes are:
|
55
|
-
|
56
|
-
* Finders are no longer overridden by default. If you want to do friendly finds,
|
57
|
-
you must do `Model.friendly.find` rather than `Model.find`. You can however
|
58
|
-
restore FriendlyId 4-style finders by using the `:finders` addon:
|
59
|
-
|
60
|
-
```ruby
|
61
|
-
friendly_id :foo, use: :slugged # you must do MyClass.friendly.find('bar')
|
62
|
-
# or...
|
63
|
-
friendly_id :foo, use: [:slugged, :finders] # you can now do MyClass.find('bar')
|
64
|
-
```
|
65
|
-
* A new "candidates" functionality which makes it easy to set up a list of
|
66
|
-
alternate slugs that can be used to uniquely distinguish records, rather than
|
67
|
-
appending a sequence. For example:
|
68
|
-
|
69
|
-
```ruby
|
70
|
-
class Restaurant < ActiveRecord::Base
|
71
|
-
extend FriendlyId
|
72
|
-
friendly_id :slug_candidates, use: :slugged
|
73
|
-
|
74
|
-
# Try building a slug based on the following fields in
|
75
|
-
# increasing order of specificity.
|
76
|
-
def slug_candidates
|
77
|
-
[
|
78
|
-
:name,
|
79
|
-
[:name, :city],
|
80
|
-
[:name, :street, :city],
|
81
|
-
[:name, :street_number, :street, :city]
|
82
|
-
]
|
83
|
-
end
|
84
|
-
end
|
85
|
-
```
|
86
|
-
* Now that candidates have been added, FriendlyId no longer uses a numeric
|
87
|
-
sequence to differentiate conflicting slug, but rather a UUID (e.g. something
|
88
|
-
like `2bc08962-b3dd-4f29-b2e6-244710c86106`). This makes the
|
89
|
-
codebase simpler and more reliable when running concurrently, at the expense
|
90
|
-
of uglier ids being generated when there are conflicts.
|
91
|
-
* The default sequence separator has been changed from two dashes to one dash.
|
92
|
-
* Slugs are no longer regenerated when a record is saved. If you want to regenerate
|
93
|
-
a slug, you must explicitly set the slug column to nil:
|
94
|
-
|
95
|
-
```ruby
|
96
|
-
restaurant.friendly_id # joes-diner
|
97
|
-
restaurant.name = "The Plaza Diner"
|
98
|
-
restaurant.save!
|
99
|
-
restaurant.friendly_id # joes-diner
|
100
|
-
restaurant.slug = nil
|
101
|
-
restaurant.save!
|
102
|
-
restaurant.friendly_id # the-plaza-diner
|
103
|
-
```
|
104
|
-
|
105
|
-
You can restore some of the old behavior by overriding the
|
106
|
-
`should_generate_new_friendly_id?` method.
|
107
|
-
* The `friendly_id` Rails generator now generates an initializer showing you
|
108
|
-
how to do some common global configuration.
|
109
|
-
* The Globalize plugin has moved to a [separate gem](https://github.com/norman/friendly_id-globalize) (currently in alpha).
|
110
|
-
* The `:reserved` module no longer includes any default reserved words.
|
111
|
-
Previously it blocked "edit" and "new" everywhere. The default word list has
|
112
|
-
been moved to `config/initializers/friendly_id.rb` and now includes many more
|
113
|
-
words.
|
114
|
-
* The `:history` and `:scoped` addons can now be used together.
|
115
|
-
* Since it now requires Rails 4, FriendlyId also now requires Ruby 1.9.3 or
|
116
|
-
higher.
|
117
|
-
|
118
|
-
#### Upgrading from FriendlyId 4.0
|
119
|
-
|
120
|
-
Run `rails generate friendly_id --skip-migration` and edit the initializer
|
121
|
-
generated in `config/initializers/friendly_id.rb`. This file contains notes
|
122
|
-
describing how to restore (or not) some of the defaults from FriendlyId 4.0.
|
123
|
-
|
124
|
-
If you want to use the `:history` and `:scoped` addons together, you must add a
|
125
|
-
`:scope` column to your friendly_id_slugs table and replace the unique index on
|
126
|
-
`:slug` and `:sluggable_type` with a unique index on those two columns, plus
|
127
|
-
the new `:scope` column.
|
128
|
-
|
129
|
-
A migration like this should be sufficient:
|
130
|
-
|
131
|
-
```ruby
|
132
|
-
add_column :friendly_id_slugs, :scope, :string
|
133
|
-
remove_index :friendly_id_slugs, [:slug, :sluggable_type]
|
134
|
-
add_index :friendly_id_slugs, [:slug, :sluggable_type]
|
135
|
-
add_index :friendly_id_slugs, [:slug, :sluggable_type, :scope], unique: true
|
136
|
-
```
|
137
|
-
|
138
|
-
## Articles
|
22
|
+
## Getting Help
|
139
23
|
|
140
|
-
|
141
|
-
[
|
24
|
+
Ask questions on [Stack Overflow](http://stackoverflow.com/questions/tagged/friendly-id)
|
25
|
+
using the "friendly-id" tag, and for bugs have a look at [the bug section](https://github.com/norman/friendly_id#bugs)
|
142
26
|
|
143
|
-
##
|
144
|
-
|
145
|
-
The most current docs from the master branch can always be found
|
146
|
-
[here](http://norman.github.io/friendly_id).
|
147
|
-
|
148
|
-
Docs for older versions are also available:
|
27
|
+
## FriendlyId Features
|
149
28
|
|
150
|
-
|
151
|
-
* [4.0](http://norman.github.io/friendly_id/4.0/)
|
152
|
-
* [3.3](http://norman.github.io/friendly_id/3.3/)
|
153
|
-
* [2.3](http://norman.github.io/friendly_id/2.3/)
|
29
|
+
FriendlyId offers many advanced features, including:
|
154
30
|
|
155
|
-
|
156
|
-
|
157
|
-
|
31
|
+
* slug history and versioning
|
32
|
+
* i18n
|
33
|
+
* scoped slugs
|
34
|
+
* reserved words
|
35
|
+
* custom slug generators
|
158
36
|
|
159
|
-
|
37
|
+
## Usage
|
160
38
|
|
161
|
-
|
162
|
-
which is now somewhat outdated but still relevant.
|
39
|
+
Add this line to your application's Gemfile:
|
163
40
|
|
41
|
+
```ruby
|
42
|
+
gem 'friendly_id', '~> 5.1.0' # Note: You MUST use 5.0.0 or greater for Rails 4.0+
|
43
|
+
```
|
164
44
|
|
165
|
-
|
45
|
+
And then execute:
|
166
46
|
|
167
47
|
```shell
|
168
|
-
|
169
|
-
cd my_app
|
170
|
-
```
|
171
|
-
```ruby
|
172
|
-
# Gemfile
|
173
|
-
gem 'friendly_id', '~> 5.1.0' # Note: You MUST use 5.0.0 or greater for Rails 4.0+
|
48
|
+
bundle install
|
174
49
|
```
|
50
|
+
|
51
|
+
Generate the friendly configuration file
|
52
|
+
|
175
53
|
```shell
|
176
54
|
rails generate friendly_id
|
177
55
|
```
|
56
|
+
|
178
57
|
>Temp solution for Rails 5.1+ : Before running the migration, go into the generated migration file and specify the Rails version:
|
179
58
|
`class CreateFriendlyIdSlugs < ActiveRecord::Migration[5.1]`
|
59
|
+
|
60
|
+
Run the migration scripts
|
61
|
+
|
180
62
|
```shell
|
181
|
-
rails
|
182
|
-
rake db:migrate
|
63
|
+
rails db:migrate
|
183
64
|
```
|
65
|
+
|
66
|
+
Edit the `app/models/user.rb` file as the following:
|
67
|
+
|
184
68
|
```ruby
|
185
|
-
# edit app/models/user.rb
|
186
69
|
class User < ApplicationRecord
|
187
70
|
extend FriendlyId
|
188
71
|
friendly_id :name, use: :slugged
|
189
72
|
end
|
73
|
+
```
|
190
74
|
|
191
|
-
User.
|
75
|
+
Edit the `app/controllers/users_controller.rb` file and replace `User.find` by `User.friendly.find`
|
192
76
|
|
193
|
-
|
194
|
-
|
77
|
+
```ruby
|
78
|
+
class UserController < ApplicationController
|
79
|
+
def show
|
80
|
+
@user = User.friendly.find(params[:id])
|
81
|
+
end
|
82
|
+
end
|
195
83
|
```
|
196
|
-
```shell
|
197
|
-
rails server
|
198
84
|
|
199
|
-
|
200
|
-
|
85
|
+
Now when you create a new user like the following:
|
86
|
+
|
201
87
|
```ruby
|
202
|
-
|
203
|
-
# to generate slugs for existing users, do this from the
|
204
|
-
# console, runner, or add a Rake task:
|
205
|
-
User.find_each(&:save)
|
88
|
+
User.create! name: "Joe Schmoe"
|
206
89
|
```
|
207
90
|
|
208
|
-
|
91
|
+
You can then access the user show page using the URL http://localhost:3000/users/joe-schmoe.
|
92
|
+
|
209
93
|
|
210
|
-
|
211
|
-
|
94
|
+
If you're adding FriendlyId to an existing app and need to generate slugs for
|
95
|
+
existing users, do this from the console, runner, or add a Rake task:
|
212
96
|
|
97
|
+
```ruby
|
98
|
+
User.find_each(&:save)
|
99
|
+
```
|
213
100
|
|
214
101
|
## Bugs
|
215
102
|
|
data/UPGRADING.md
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
## Articles
|
2
|
+
|
3
|
+
* [Migrating an ad-hoc URL slug system to FriendlyId](http://olivierlacan.com/posts/migrating-an-ad-hoc-url-slug-system-to-friendly-id/)
|
4
|
+
* [Pretty URLs with FriendlyId](http://railscasts.com/episodes/314-pretty-urls-with-friendlyid)
|
5
|
+
|
6
|
+
## Docs
|
7
|
+
|
8
|
+
The most current docs from the master branch can always be found
|
9
|
+
[here](http://norman.github.io/friendly_id).
|
10
|
+
|
11
|
+
Docs for older versions are also available:
|
12
|
+
|
13
|
+
* [5.0](http://norman.github.io/friendly_id/5.0/)
|
14
|
+
* [4.0](http://norman.github.io/friendly_id/4.0/)
|
15
|
+
* [3.3](http://norman.github.io/friendly_id/3.3/)
|
16
|
+
* [2.3](http://norman.github.io/friendly_id/2.3/)
|
17
|
+
|
18
|
+
## What Changed in Version 5.1
|
19
|
+
|
20
|
+
5.1 is a bugfix release, but bumps the minor version because some applications may be dependent
|
21
|
+
on the previously buggy behavior. The changes include:
|
22
|
+
|
23
|
+
* Blank strings can no longer be used as slugs.
|
24
|
+
* When the first slug candidate is rejected because it is reserved, additional candidates will
|
25
|
+
now be considered before marking the record as invalid.
|
26
|
+
* The `:finders` module is now compatible with Rails 4.2.
|
27
|
+
|
28
|
+
## What Changed in Version 5.0
|
29
|
+
|
30
|
+
As of version 5.0, FriendlyId uses [semantic versioning](http://semver.org/). Therefore, as you might
|
31
|
+
infer from the version number, 5.0 introduces changes incompatible with 4.0.
|
32
|
+
|
33
|
+
The most important changes are:
|
34
|
+
|
35
|
+
* Finders are no longer overridden by default. If you want to do friendly finds,
|
36
|
+
you must do `Model.friendly.find` rather than `Model.find`. You can however
|
37
|
+
restore FriendlyId 4-style finders by using the `:finders` addon:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
friendly_id :foo, use: :slugged # you must do MyClass.friendly.find('bar')
|
41
|
+
# or...
|
42
|
+
friendly_id :foo, use: [:slugged, :finders] # you can now do MyClass.find('bar')
|
43
|
+
```
|
44
|
+
* A new "candidates" functionality which makes it easy to set up a list of
|
45
|
+
alternate slugs that can be used to uniquely distinguish records, rather than
|
46
|
+
appending a sequence. For example:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
class Restaurant < ActiveRecord::Base
|
50
|
+
extend FriendlyId
|
51
|
+
friendly_id :slug_candidates, use: :slugged
|
52
|
+
|
53
|
+
# Try building a slug based on the following fields in
|
54
|
+
# increasing order of specificity.
|
55
|
+
def slug_candidates
|
56
|
+
[
|
57
|
+
:name,
|
58
|
+
[:name, :city],
|
59
|
+
[:name, :street, :city],
|
60
|
+
[:name, :street_number, :street, :city]
|
61
|
+
]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
```
|
65
|
+
* Now that candidates have been added, FriendlyId no longer uses a numeric
|
66
|
+
sequence to differentiate conflicting slug, but rather a UUID (e.g. something
|
67
|
+
like `2bc08962-b3dd-4f29-b2e6-244710c86106`). This makes the
|
68
|
+
codebase simpler and more reliable when running concurrently, at the expense
|
69
|
+
of uglier ids being generated when there are conflicts.
|
70
|
+
* The default sequence separator has been changed from two dashes to one dash.
|
71
|
+
* Slugs are no longer regenerated when a record is saved. If you want to regenerate
|
72
|
+
a slug, you must explicitly set the slug column to nil:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
restaurant.friendly_id # joes-diner
|
76
|
+
restaurant.name = "The Plaza Diner"
|
77
|
+
restaurant.save!
|
78
|
+
restaurant.friendly_id # joes-diner
|
79
|
+
restaurant.slug = nil
|
80
|
+
restaurant.save!
|
81
|
+
restaurant.friendly_id # the-plaza-diner
|
82
|
+
```
|
83
|
+
|
84
|
+
You can restore some of the old behavior by overriding the
|
85
|
+
`should_generate_new_friendly_id?` method.
|
86
|
+
* The `friendly_id` Rails generator now generates an initializer showing you
|
87
|
+
how to do some common global configuration.
|
88
|
+
* The Globalize plugin has moved to a [separate gem](https://github.com/norman/friendly_id-globalize) (currently in alpha).
|
89
|
+
* The `:reserved` module no longer includes any default reserved words.
|
90
|
+
Previously it blocked "edit" and "new" everywhere. The default word list has
|
91
|
+
been moved to `config/initializers/friendly_id.rb` and now includes many more
|
92
|
+
words.
|
93
|
+
* The `:history` and `:scoped` addons can now be used together.
|
94
|
+
* Since it now requires Rails 4, FriendlyId also now requires Ruby 1.9.3 or
|
95
|
+
higher.
|
96
|
+
|
97
|
+
## Upgrading from FriendlyId 4.0
|
98
|
+
|
99
|
+
Run `rails generate friendly_id --skip-migration` and edit the initializer
|
100
|
+
generated in `config/initializers/friendly_id.rb`. This file contains notes
|
101
|
+
describing how to restore (or not) some of the defaults from FriendlyId 4.0.
|
102
|
+
|
103
|
+
If you want to use the `:history` and `:scoped` addons together, you must add a
|
104
|
+
`:scope` column to your friendly_id_slugs table and replace the unique index on
|
105
|
+
`:slug` and `:sluggable_type` with a unique index on those two columns, plus
|
106
|
+
the new `:scope` column.
|
107
|
+
|
108
|
+
A migration like this should be sufficient:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
add_column :friendly_id_slugs, :scope, :string
|
112
|
+
remove_index :friendly_id_slugs, [:slug, :sluggable_type]
|
113
|
+
add_index :friendly_id_slugs, [:slug, :sluggable_type]
|
114
|
+
add_index :friendly_id_slugs, [:slug, :sluggable_type, :scope], unique: true
|
115
|
+
```
|
data/friendly_id.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency 'activerecord', '>= 4.0.0'
|
20
20
|
|
21
21
|
s.add_development_dependency 'coveralls'
|
22
|
-
s.add_development_dependency 'railties', '
|
22
|
+
s.add_development_dependency 'railties', '>= 4.0'
|
23
23
|
s.add_development_dependency 'minitest', '~> 5.3'
|
24
24
|
s.add_development_dependency 'mocha', '~> 1.1'
|
25
25
|
s.add_development_dependency 'yard'
|
@@ -9,8 +9,8 @@ gem 'i18n', '~> 0.7.0'
|
|
9
9
|
# Database Configuration
|
10
10
|
group :development, :test do
|
11
11
|
platforms :jruby do
|
12
|
-
gem 'activerecord-jdbcmysql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter
|
13
|
-
gem 'activerecord-jdbcpostgresql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter
|
12
|
+
gem 'activerecord-jdbcmysql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: '50-stable'
|
13
|
+
gem 'activerecord-jdbcpostgresql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: '50-stable'
|
14
14
|
gem 'kramdown'
|
15
15
|
end
|
16
16
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec path: '../'
|
4
|
+
|
5
|
+
gem 'activerecord', '~> 5.1.0'
|
6
|
+
gem 'railties', '~> 5.1.0'
|
7
|
+
|
8
|
+
# Database Configuration
|
9
|
+
group :development, :test do
|
10
|
+
platforms :jruby do
|
11
|
+
gem 'activerecord-jdbcmysql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: 'master'
|
12
|
+
gem 'activerecord-jdbcpostgresql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: 'master'
|
13
|
+
gem 'kramdown'
|
14
|
+
end
|
15
|
+
|
16
|
+
platforms :ruby, :rbx do
|
17
|
+
gem 'sqlite3'
|
18
|
+
gem 'mysql2'
|
19
|
+
gem 'pg'
|
20
|
+
gem 'redcarpet'
|
21
|
+
end
|
22
|
+
|
23
|
+
platforms :rbx do
|
24
|
+
gem 'rubysl', '~> 2.0'
|
25
|
+
gem 'rubinius-developer_tools'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec path: '../'
|
4
|
+
|
5
|
+
gem 'activerecord', '~> 5.2.0'
|
6
|
+
gem 'railties', '~> 5.2.0'
|
7
|
+
|
8
|
+
# Database Configuration
|
9
|
+
group :development, :test do
|
10
|
+
platforms :jruby do
|
11
|
+
gem 'activerecord-jdbcmysql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: 'master'
|
12
|
+
gem 'activerecord-jdbcpostgresql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', branch: 'master'
|
13
|
+
gem 'kramdown'
|
14
|
+
end
|
15
|
+
|
16
|
+
platforms :ruby, :rbx do
|
17
|
+
gem 'sqlite3'
|
18
|
+
gem 'mysql2'
|
19
|
+
gem 'pg'
|
20
|
+
gem 'redcarpet'
|
21
|
+
end
|
22
|
+
|
23
|
+
platforms :rbx do
|
24
|
+
gem 'rubysl', '~> 2.0'
|
25
|
+
gem 'rubinius-developer_tools'
|
26
|
+
end
|
27
|
+
end
|
@@ -9,7 +9,7 @@ module FriendlyId
|
|
9
9
|
# id matching '123' and then fall back to looking for a record with the
|
10
10
|
# numeric id '123'.
|
11
11
|
#
|
12
|
-
# Since FriendlyId 5.0, if the id is a
|
12
|
+
# Since FriendlyId 5.0, if the id is a nonnumeric string like '123-foo' it
|
13
13
|
# will *only* search by friendly id and not fall back to the regular find
|
14
14
|
# method.
|
15
15
|
#
|
@@ -50,7 +50,7 @@ module FriendlyId
|
|
50
50
|
when :integer
|
51
51
|
Integer(id, 10) rescue false
|
52
52
|
when :uuid
|
53
|
-
id.match
|
53
|
+
id.match(/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/)
|
54
54
|
else
|
55
55
|
true
|
56
56
|
end
|
data/lib/friendly_id/history.rb
CHANGED
@@ -72,7 +72,7 @@ method.
|
|
72
72
|
# Configures the model instance to use the History add-on.
|
73
73
|
def self.included(model_class)
|
74
74
|
model_class.class_eval do
|
75
|
-
has_many :slugs, -> {order(
|
75
|
+
has_many :slugs, -> {order(id: :desc)}, {
|
76
76
|
:as => :sluggable,
|
77
77
|
:dependent => @friendly_id_config.dependent_value,
|
78
78
|
:class_name => Slug.to_s
|
@@ -86,14 +86,13 @@ method.
|
|
86
86
|
include ::FriendlyId::FinderMethods
|
87
87
|
|
88
88
|
def exists_by_friendly_id?(id)
|
89
|
-
|
89
|
+
super || joins(:slugs).where(slug_history_clause(id)).exists?
|
90
90
|
end
|
91
91
|
|
92
92
|
private
|
93
93
|
|
94
94
|
def first_by_friendly_id(id)
|
95
|
-
|
96
|
-
matching_record || slug_table_record(id)
|
95
|
+
super || slug_table_record(id)
|
97
96
|
end
|
98
97
|
|
99
98
|
def slug_table_record(id)
|
@@ -18,6 +18,12 @@ FriendlyId.defaults do |config|
|
|
18
18
|
|
19
19
|
config.reserved_words = %w(new edit index session login logout users admin
|
20
20
|
stylesheets assets javascripts images)
|
21
|
+
|
22
|
+
# This adds an option to to treat reserved words as conflicts rather than exceptions.
|
23
|
+
# When there is no good candidate, a UUID will be appended, matching the existing
|
24
|
+
# conflict behavior.
|
25
|
+
|
26
|
+
# config.treat_reserved_as_conflict = true
|
21
27
|
|
22
28
|
# ## Friendly Finders
|
23
29
|
#
|
@@ -76,7 +82,12 @@ FriendlyId.defaults do |config|
|
|
76
82
|
# behavior by overriding the `should_generate_new_friendly_id?` method that
|
77
83
|
# FriendlyId adds to your model. The change below makes FriendlyId 5.0 behave
|
78
84
|
# more like 4.0.
|
85
|
+
# Note: Use(include) Slugged module in the config if using the anonymous module.
|
86
|
+
# If you have `friendly_id :name, use: slugged` in the model, Slugged module
|
87
|
+
# is included after the anonymous module defined in the initializer, so it
|
88
|
+
# overrides the `should_generate_new_friendly_id?` method from the anonymous module.
|
79
89
|
#
|
90
|
+
# config.use :slugged
|
80
91
|
# config.use Module.new {
|
81
92
|
# def should_generate_new_friendly_id?
|
82
93
|
# slug.blank? || <your_column_name_here>_changed?
|
@@ -1,4 +1,11 @@
|
|
1
|
-
|
1
|
+
migration_class =
|
2
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
3
|
+
ActiveRecord::Migration[4.2]
|
4
|
+
else
|
5
|
+
ActiveRecord::Migration
|
6
|
+
end
|
7
|
+
|
8
|
+
class CreateFriendlyIdSlugs < migration_class
|
2
9
|
def change
|
3
10
|
create_table :friendly_id_slugs do |t|
|
4
11
|
t.string :slug, :null => false
|
@@ -2,7 +2,6 @@ module FriendlyId
|
|
2
2
|
# Instances of these classes will never be considered a friendly id.
|
3
3
|
# @see FriendlyId::ObjectUtils#friendly_id
|
4
4
|
UNFRIENDLY_CLASSES = [
|
5
|
-
ActiveRecord::Base,
|
6
5
|
Array,
|
7
6
|
FalseClass,
|
8
7
|
Hash,
|
@@ -59,6 +58,10 @@ module FriendlyId
|
|
59
58
|
true
|
60
59
|
end
|
61
60
|
end
|
61
|
+
|
62
|
+
def self.mark_as_unfriendly(klass)
|
63
|
+
klass.send(:include, FriendlyId::UnfriendlyUtils)
|
64
|
+
end
|
62
65
|
end
|
63
66
|
|
64
67
|
Object.send :include, FriendlyId::ObjectUtils
|
@@ -66,4 +69,8 @@ Object.send :include, FriendlyId::ObjectUtils
|
|
66
69
|
# Considered unfriendly if object is an instance of an unfriendly class or
|
67
70
|
# one of its descendants.
|
68
71
|
|
69
|
-
FriendlyId::UNFRIENDLY_CLASSES.each { |klass|
|
72
|
+
FriendlyId::UNFRIENDLY_CLASSES.each { |klass| FriendlyId.mark_as_unfriendly(klass) }
|
73
|
+
|
74
|
+
ActiveSupport.on_load(:active_record) do
|
75
|
+
FriendlyId.mark_as_unfriendly(ActiveRecord::Base)
|
76
|
+
end
|
data/lib/friendly_id/slug.rb
CHANGED
data/lib/friendly_id/version.rb
CHANGED
data/test/helper.rb
CHANGED
data/test/history_test.rb
CHANGED
@@ -172,7 +172,7 @@ class HistoryTestWithAutomaticSlugRegeneration < HistoryTest
|
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
175
|
-
class DependentDestroyTest <
|
175
|
+
class DependentDestroyTest < TestCaseClass
|
176
176
|
|
177
177
|
include FriendlyId::Test
|
178
178
|
|
@@ -211,6 +211,37 @@ class DependentDestroyTest < HistoryTest
|
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
214
|
+
if ActiveRecord::VERSION::STRING >= '5.0'
|
215
|
+
class HistoryTestWithParanoidDeletes < HistoryTest
|
216
|
+
class ParanoidRecord < ActiveRecord::Base
|
217
|
+
extend FriendlyId
|
218
|
+
friendly_id :name, :use => :history, :dependent => false
|
219
|
+
|
220
|
+
default_scope { where(deleted_at: nil) }
|
221
|
+
end
|
222
|
+
|
223
|
+
def model_class
|
224
|
+
ParanoidRecord
|
225
|
+
end
|
226
|
+
|
227
|
+
test 'slug should have a sluggable even when soft deleted by a library' do
|
228
|
+
transaction do
|
229
|
+
assert FriendlyId::Slug.find_by_slug('paranoid').nil?
|
230
|
+
record = model_class.create(name: 'paranoid')
|
231
|
+
assert FriendlyId::Slug.find_by_slug('paranoid').present?
|
232
|
+
|
233
|
+
record.update_attribute(:deleted_at, Time.now)
|
234
|
+
|
235
|
+
orphan_slug = FriendlyId::Slug.find_by_slug('paranoid')
|
236
|
+
assert orphan_slug.present?, 'Orphaned slug should exist'
|
237
|
+
|
238
|
+
assert orphan_slug.valid?, "Errors: #{orphan_slug.errors.full_messages}"
|
239
|
+
assert orphan_slug.sluggable.present?, 'Orphaned slug should still find corresponding paranoid sluggable'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
214
245
|
class HistoryTestWithSti < HistoryTest
|
215
246
|
class Journalist < ActiveRecord::Base
|
216
247
|
extend FriendlyId
|
@@ -248,7 +279,7 @@ class HistoryTestWithFriendlyFinders < HistoryTest
|
|
248
279
|
begin
|
249
280
|
assert model_class.find(old_friendly_id)
|
250
281
|
assert model_class.exists?(old_friendly_id), "should exist? by old id for #{model_class.name}"
|
251
|
-
rescue ActiveRecord::RecordNotFound
|
282
|
+
rescue ActiveRecord::RecordNotFound
|
252
283
|
flunk "Could not find record by old id for #{model_class.name}"
|
253
284
|
end
|
254
285
|
end
|
@@ -356,4 +387,4 @@ class ScopedHistoryTest < TestCaseClass
|
|
356
387
|
assert_equal record.slug, second_record.slug
|
357
388
|
end
|
358
389
|
end
|
359
|
-
end
|
390
|
+
end
|
data/test/object_utils_test.rb
CHANGED
data/test/schema.rb
CHANGED
@@ -2,7 +2,14 @@ require "friendly_id/migration"
|
|
2
2
|
|
3
3
|
module FriendlyId
|
4
4
|
module Test
|
5
|
-
|
5
|
+
migration_class =
|
6
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
7
|
+
ActiveRecord::Migration[4.2]
|
8
|
+
else
|
9
|
+
ActiveRecord::Migration
|
10
|
+
end
|
11
|
+
|
12
|
+
class Schema < migration_class
|
6
13
|
class << self
|
7
14
|
def down
|
8
15
|
CreateFriendlyIdSlugs.down
|
@@ -41,6 +48,12 @@ module FriendlyId
|
|
41
48
|
add_column table_name, :slug, :string
|
42
49
|
end
|
43
50
|
|
51
|
+
paranoid_tables.each do |table_name|
|
52
|
+
add_column table_name, :slug, :string
|
53
|
+
add_column table_name, :deleted_at, :datetime
|
54
|
+
add_index table_name, :deleted_at
|
55
|
+
end
|
56
|
+
|
44
57
|
# This will be used to test scopes
|
45
58
|
add_column :novels, :novelist_id, :integer
|
46
59
|
add_column :novels, :publisher_id, :integer
|
@@ -78,6 +91,10 @@ module FriendlyId
|
|
78
91
|
%w[journalists articles novelists novels manuals cities]
|
79
92
|
end
|
80
93
|
|
94
|
+
def paranoid_tables
|
95
|
+
["paranoid_records"]
|
96
|
+
end
|
97
|
+
|
81
98
|
def tables_with_uuid_primary_key
|
82
99
|
["menu_items"]
|
83
100
|
end
|
@@ -91,7 +108,7 @@ module FriendlyId
|
|
91
108
|
end
|
92
109
|
|
93
110
|
def tables
|
94
|
-
simple_tables + slugged_tables + scoped_tables
|
111
|
+
simple_tables + slugged_tables + scoped_tables + paranoid_tables
|
95
112
|
end
|
96
113
|
end
|
97
114
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: friendly_id
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.2.
|
4
|
+
version: 5.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Norman Clarke
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-04-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -43,14 +43,14 @@ dependencies:
|
|
43
43
|
name: railties
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '4.0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '4.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
@@ -158,12 +158,15 @@ files:
|
|
158
158
|
- MIT-LICENSE
|
159
159
|
- README.md
|
160
160
|
- Rakefile
|
161
|
+
- UPGRADING.md
|
161
162
|
- bench.rb
|
162
163
|
- friendly_id.gemspec
|
163
164
|
- gemfiles/Gemfile.rails-4.0.rb
|
164
165
|
- gemfiles/Gemfile.rails-4.1.rb
|
165
166
|
- gemfiles/Gemfile.rails-4.2.rb
|
166
167
|
- gemfiles/Gemfile.rails-5.0.rb
|
168
|
+
- gemfiles/Gemfile.rails-5.1.rb
|
169
|
+
- gemfiles/Gemfile.rails-5.2.rb
|
167
170
|
- guide.rb
|
168
171
|
- lib/friendly_id.rb
|
169
172
|
- lib/friendly_id/.gitattributes
|