slugs 1.3.2 → 2.0.0
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/MIT-LICENSE +1 -1
- data/Rakefile +5 -0
- data/lib/slugs.rb +36 -4
- data/lib/slugs/concern.rb +50 -0
- data/lib/slugs/configuration.rb +7 -0
- data/lib/slugs/extensions/action_dispatch/generator.rb +24 -0
- data/lib/slugs/extensions/action_dispatch/optimized_url_helper.rb +20 -0
- data/lib/slugs/extensions/active_record/base.rb +19 -0
- data/lib/slugs/railtie.rb +9 -1
- data/lib/slugs/version.rb +1 -1
- data/test/dummy/Rakefile +1 -2
- data/test/dummy/app/assets/javascripts/application.js +2 -2
- data/test/dummy/app/assets/stylesheets/application.css +6 -4
- data/test/dummy/app/models/category.rb +7 -0
- data/test/dummy/app/models/product.rb +8 -0
- data/test/dummy/app/models/shop.rb +5 -0
- data/test/dummy/app/models/user.rb +5 -0
- data/test/dummy/app/views/layouts/application.html.erb +9 -11
- data/test/dummy/bin/bundle +0 -0
- data/test/dummy/bin/rails +1 -1
- data/test/dummy/bin/rake +0 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +1 -1
- data/test/dummy/config/application.rb +3 -1
- data/test/dummy/config/boot.rb +1 -1
- data/test/dummy/config/database.yml +4 -22
- data/test/dummy/config/database.yml.travis +12 -0
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/development.rb +14 -2
- data/test/dummy/config/environments/production.rb +20 -25
- data/test/dummy/config/environments/test.rb +8 -10
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/mime_types.rb +1 -2
- data/test/dummy/config/initializers/session_store.rb +1 -1
- data/test/dummy/config/initializers/slugs.rb +5 -0
- data/test/dummy/config/routes.rb +2 -53
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/migrate/20161016174020_create_users.rb +9 -0
- data/test/dummy/db/migrate/20161016174126_create_shops.rb +8 -0
- data/test/dummy/db/migrate/20161016174202_create_products.rb +10 -0
- data/test/dummy/db/migrate/20161016174225_create_categories.rb +9 -0
- data/test/dummy/db/schema.rb +21 -26
- data/test/dummy/log/development.log +144 -0
- data/test/dummy/log/test.log +4190 -0
- data/test/dummy/public/404.html +20 -11
- data/test/dummy/public/422.html +20 -11
- data/test/dummy/public/500.html +19 -10
- data/test/records_test.rb +15 -103
- data/test/routes_test.rb +17 -0
- data/test/test_helper.rb +4 -12
- metadata +49 -54
- data/lib/slugs/active_record/base.rb +0 -82
- data/lib/slugs/active_record/finders.rb +0 -24
- data/lib/slugs/active_record/non_translatable.rb +0 -26
- data/lib/slugs/active_record/translatable.rb +0 -49
- data/test/dummy/README.rdoc +0 -28
- data/test/dummy/app/models/simple.rb +0 -5
- data/test/dummy/app/models/translatable.rb +0 -7
- data/test/dummy/app/models/translatable_translation.rb +0 -8
- data/test/dummy/app/models/without.rb +0 -2
- data/test/dummy/config/initializers/secret_token.rb +0 -13
- data/test/dummy/db/migrate/20130819183013_create_simples.rb +0 -11
- data/test/dummy/db/migrate/20130819183047_create_withouts.rb +0 -9
- data/test/dummy/db/migrate/20130819183119_create_translatables.rb +0 -8
- data/test/dummy/db/migrate/20130819183257_create_translatable_translations.rb +0 -15
@@ -1,82 +0,0 @@
|
|
1
|
-
module Slugs
|
2
|
-
module ActiveRecord
|
3
|
-
module Base
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
def to_param
|
7
|
-
if self.class.sluggable?
|
8
|
-
if slug_changed?
|
9
|
-
slug_was
|
10
|
-
else
|
11
|
-
slug
|
12
|
-
end
|
13
|
-
else
|
14
|
-
super
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
|
20
|
-
def generate_slug
|
21
|
-
unless slug_changed?
|
22
|
-
options = self.class.slug
|
23
|
-
case options
|
24
|
-
when Symbol
|
25
|
-
value = send(options)
|
26
|
-
when Array
|
27
|
-
value = options.each.map{ |p| send(p) }.join(' ')
|
28
|
-
else
|
29
|
-
value = options.call(self) if options.respond_to? :call
|
30
|
-
end
|
31
|
-
value = value.to_s.parameterize
|
32
|
-
if value.present? and value != slug
|
33
|
-
previous_value = self.class.unscoped.find_previous_slug(value)
|
34
|
-
if previous_value.present?
|
35
|
-
index = previous_value.match(/#{value}-([0-9]+)$/)
|
36
|
-
if index.present?
|
37
|
-
value << "-#{index[1].to_i + 1}"
|
38
|
-
else
|
39
|
-
value << '-1'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
self.slug = value
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
module ClassMethods
|
48
|
-
|
49
|
-
attr_accessor :slug
|
50
|
-
|
51
|
-
def inherited(subclass)
|
52
|
-
subclass.slug = slug
|
53
|
-
super
|
54
|
-
end
|
55
|
-
|
56
|
-
def sluggable?
|
57
|
-
slug.present?
|
58
|
-
end
|
59
|
-
|
60
|
-
def has_slug(*args, &block)
|
61
|
-
unless sluggable?
|
62
|
-
if try(:translatable?)
|
63
|
-
include Slugs::ActiveRecord::Translatable
|
64
|
-
attr_translatable :slug
|
65
|
-
before_validation :generate_slugs
|
66
|
-
else
|
67
|
-
include Slugs::ActiveRecord::NonTranslatable
|
68
|
-
before_validation :generate_slug
|
69
|
-
end
|
70
|
-
include Slugs::ActiveRecord::Finders
|
71
|
-
if block_given?
|
72
|
-
self.slug = block
|
73
|
-
else
|
74
|
-
self.slug = args.size == 1 ? args[0] : args
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Slugs
|
2
|
-
module ActiveRecord
|
3
|
-
module Finders
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
module ClassMethods
|
6
|
-
|
7
|
-
def slugged
|
8
|
-
all.extending do
|
9
|
-
|
10
|
-
def find(*args)
|
11
|
-
find_by_slug args.first
|
12
|
-
end
|
13
|
-
|
14
|
-
def exists?(*args)
|
15
|
-
exists_by_slug? args.first
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Slugs
|
2
|
-
module ActiveRecord
|
3
|
-
module NonTranslatable
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
module ClassMethods
|
6
|
-
|
7
|
-
def find_previous_slug(slug)
|
8
|
-
where(
|
9
|
-
'slug LIKE ? OR slug = ?', "#{slug}-%", slug
|
10
|
-
).order(
|
11
|
-
'LENGTH(slug) DESC, slug DESC'
|
12
|
-
).map(&:slug).select{ |r| r =~ /^#{slug}(-\d+)?$/ }.first
|
13
|
-
end
|
14
|
-
|
15
|
-
def find_by_slug(id)
|
16
|
-
find_by slug: id
|
17
|
-
end
|
18
|
-
|
19
|
-
def exists_by_slug?(id)
|
20
|
-
exists? slug: id
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Slugs
|
2
|
-
module ActiveRecord
|
3
|
-
module Translatable
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
protected
|
7
|
-
|
8
|
-
def generate_slugs
|
9
|
-
old_locale = current_locale
|
10
|
-
I18n.available_locales.each do |locale|
|
11
|
-
I18n.locale = locale
|
12
|
-
with_locale locale
|
13
|
-
generate_slug
|
14
|
-
end
|
15
|
-
I18n.locale = old_locale
|
16
|
-
with_locale old_locale
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
|
21
|
-
def find_previous_slug(slug)
|
22
|
-
t = reflect_on_association(:translations)
|
23
|
-
joins(
|
24
|
-
"INNER JOIN #{t.table_name} t ON t.#{t.foreign_key} = #{table_name}.#{t.active_record_primary_key}"
|
25
|
-
).where(
|
26
|
-
"(t.slug LIKE ? OR t.slug = ?) AND t.locale = ?", "#{slug}-%", slug, I18n.locale
|
27
|
-
).order(
|
28
|
-
'LENGTH(t.slug) DESC, t.slug DESC'
|
29
|
-
).map(&:slug).select{ |r| r =~ /^#{slug}(-\d+)?$/ }.first
|
30
|
-
end
|
31
|
-
|
32
|
-
def find_by_slug(id)
|
33
|
-
t = reflect_on_association(:translations)
|
34
|
-
joins(
|
35
|
-
"INNER JOIN #{t.table_name} t ON t.#{t.foreign_key} = #{table_name}.#{t.active_record_primary_key}"
|
36
|
-
).where(
|
37
|
-
"t.slug = ? AND t.locale = ?", id, I18n.locale
|
38
|
-
).readonly(false).first
|
39
|
-
end
|
40
|
-
|
41
|
-
def exists_by_slug?(id)
|
42
|
-
t = reflect_on_association(:translations)
|
43
|
-
joins(:translations).exists? t.table_name.to_sym => { slug: id, locale: I18n.locale }
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/test/dummy/README.rdoc
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
== README
|
2
|
-
|
3
|
-
This README would normally document whatever steps are necessary to get the
|
4
|
-
application up and running.
|
5
|
-
|
6
|
-
Things you may want to cover:
|
7
|
-
|
8
|
-
* Ruby version
|
9
|
-
|
10
|
-
* System dependencies
|
11
|
-
|
12
|
-
* Configuration
|
13
|
-
|
14
|
-
* Database creation
|
15
|
-
|
16
|
-
* Database initialization
|
17
|
-
|
18
|
-
* How to run the test suite
|
19
|
-
|
20
|
-
* Services (job queues, cache servers, search engines, etc.)
|
21
|
-
|
22
|
-
* Deployment instructions
|
23
|
-
|
24
|
-
* ...
|
25
|
-
|
26
|
-
|
27
|
-
Please feel free to use a different markup language if you do not plan to run
|
28
|
-
<tt>rake doc:app</tt>.
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Your secret key is used for verifying the integrity of signed cookies.
|
4
|
-
# If you change this key, all old signed cookies will become invalid!
|
5
|
-
|
6
|
-
# Make sure the secret is at least 30 characters and all random,
|
7
|
-
# no regular words or you'll be exposed to dictionary attacks.
|
8
|
-
# You can use `rake secret` to generate a secure secret key.
|
9
|
-
|
10
|
-
# Make sure your secret_key_base is kept private
|
11
|
-
# if you're sharing your code publicly.
|
12
|
-
Dummy::Application.config.secret_token = '9c3fdbe4ad05cd861c28b88f90272c74a5ee9bbc4d7aaa9ca9685303726f61228bac98672426242abe35c78e3b37517702862a399e65bf75a78d00ac9585e0b5'
|
13
|
-
Dummy::Application.config.secret_key_base = '9c3fdbe4ad05cd861c28b88f90272c74a5ee9bbc4d7aaa9ca9685303726f61228bac98672426242abe35c78e3b37517702862a399e65bf75a78d00ac9585e0b5'
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class CreateTranslatableTranslations < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :translatable_translations do |t|
|
4
|
-
t.integer :translatable_id
|
5
|
-
t.string :locale
|
6
|
-
t.string :name
|
7
|
-
t.integer :age
|
8
|
-
t.string :slug
|
9
|
-
|
10
|
-
t.timestamps
|
11
|
-
end
|
12
|
-
add_index :translatable_translations, :translatable_id
|
13
|
-
add_index :translatable_translations, :locale
|
14
|
-
end
|
15
|
-
end
|