friendly_id 5.2.3 → 5.2.4
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.
- 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
|
[](https://codeclimate.com/github/norman/friendly_id)
|
3
3
|
[](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
|