i76-has_slug 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -46,7 +46,8 @@ module HasSlug
46
46
  extend SluggableClassMethods
47
47
  include SluggableInstanceMethods
48
48
 
49
- before_save :set_slug, :if => :new_slug_needed?
49
+ before_save :set_slug,
50
+ :if => :new_slug_needed?
50
51
  else
51
52
  require 'has_slug/not_sluggable_class_methods'
52
53
  require 'has_slug/not_sluggable_instance_methods'
@@ -7,6 +7,22 @@ module HasSlug::SluggableClassMethods
7
7
  end
8
8
  end
9
9
 
10
+ def slug_scope_attribute
11
+ return @@slug_scope_attribute if defined?(@@slug_scope_attribute)
12
+
13
+ if scope = has_slug_options[:scope]
14
+ if columns.any? { |c| c.name == scope }
15
+ @@slug_scope_attribute = scope.to_sym
16
+ elsif columns.any? { |c| c.name == "#{scope}_id" }
17
+ @@slug_scope_attribute = "#{scope}_id".to_sym
18
+ else
19
+ raise Exception, "has_slug's scope '#{scope}' does not exist in the model '#{self.class.to_s}'"
20
+ end
21
+ end
22
+
23
+ @@slug_scope_attribute
24
+ end
25
+
10
26
  # Find a single record that has the same slug as the given record's slug
11
27
  def find_one_with_same_slug(object)
12
28
  slug_column = has_slug_options[:slug_column]
@@ -16,11 +32,8 @@ module HasSlug::SluggableClassMethods
16
32
  end
17
33
 
18
34
  if scope = has_slug_options[:scope]
19
- scope_attribute = "#{scope}_id" if !columns.any? { |c| c.name == scope } &&
20
- columns.any? { |c| c.name == "#{scope}_id" }
21
-
22
- result = send("find_by_#{slug_column}_and_#{scope_attribute}",
23
- object.slug, object.send(scope), options)
35
+ result = send("find_by_#{slug_column}_and_#{slug_scope_attribute}",
36
+ object.slug, object.send(scope), options)
24
37
  else
25
38
  result = send("find_by_#{slug_column}", object.slug, options)
26
39
  end
@@ -22,8 +22,15 @@ module HasSlug::SluggableInstanceMethods
22
22
  end
23
23
 
24
24
  def new_slug_needed?
25
- !self.send("#{self.class.has_slug_options[:slug_column]}_changed?") &&
26
- (self.new_record? || self.send("#{self.class.has_slug_options[:attribute]}_changed?"))
25
+ slug_changed = self.send("#{self.class.has_slug_options[:slug_column]}_changed?")
26
+ sluggable_changed = self.send("#{self.class.has_slug_options[:attribute]}_changed?")
27
+
28
+ scope_changed = if self.class.has_slug_options[:scope] then self.send("#{self.class.slug_scope_attribute}_changed?")
29
+ else false
30
+ end
31
+
32
+ (!slug_changed && (self.new_record? || sluggable_changed)) || scope_changed
33
+
27
34
  end
28
35
 
29
36
  def to_param
@@ -60,7 +60,7 @@ class HasSlugTest < Test::Unit::TestCase
60
60
  context 'with a slug column' do
61
61
  setup do
62
62
  @new_york = Factory(:city, :name => 'New York')
63
- @san_Francisco = Factory(:city, :name => 'San Francisco')
63
+ @san_francisco = Factory(:city, :name => 'San Francisco')
64
64
  end
65
65
 
66
66
  context 'and a custom slug' do
@@ -88,20 +88,29 @@ class HasSlugTest < Test::Unit::TestCase
88
88
 
89
89
  should 'create the same slug in a different scope' do
90
90
  @da_marco_2 = Factory(:restaurant, :name => 'Da Marco',
91
- :city => @san_Francisco)
91
+ :city => @san_francisco)
92
92
 
93
93
  assert_equal @da_marco_2.slug, @da_marco.slug
94
94
  end
95
+
96
+ should 'not create duplicate slugs' do
97
+ @da_marco_2 = Factory(:restaurant, :name => 'Da Marco',
98
+ :city => @new_york)
99
+ assert_not_equal @da_marco_2.slug, @da_marco.slug
100
+
101
+ @da_marco_2.update_attributes(:city => @san_fransisco)
102
+ assert_equal @da_marco_2.slug, @da_marco.slug
103
+ end
95
104
  end
96
105
 
97
106
  should 'set the slug' do
98
107
  assert_equal 'new-york', @new_york.slug
99
- assert_equal 'san-francisco', @san_Francisco.slug
108
+ assert_equal 'san-francisco', @san_francisco.slug
100
109
  end
101
110
 
102
111
  should 'return the slug on call to #to_param' do
103
112
  assert_equal @new_york.slug, @new_york.to_param
104
- assert_equal @san_Francisco.slug, @san_Francisco.to_param
113
+ assert_equal @san_francisco.slug, @san_francisco.to_param
105
114
  end
106
115
 
107
116
  should 'not create duplicate slugs' do
@@ -125,21 +134,21 @@ class HasSlugTest < Test::Unit::TestCase
125
134
  end
126
135
 
127
136
  should 'still find some by id' do
128
- cities = City.find([@new_york.id, @san_Francisco.id])
137
+ cities = City.find([@new_york.id, @san_francisco.id])
129
138
 
130
139
  assert_equal 2, cities.length
131
140
  assert !cities.any?(&:found_by_slug?)
132
141
  end
133
142
 
134
143
  should 'find some by slug' do
135
- cities = City.find([@new_york.slug, @san_Francisco.slug])
144
+ cities = City.find([@new_york.slug, @san_francisco.slug])
136
145
 
137
146
  assert_equal 2, cities.length
138
147
  assert cities.all?(&:found_by_slug?)
139
148
  end
140
149
 
141
150
  should 'find some by id or slug' do
142
- cities = City.find([@new_york.id, @san_Francisco.slug])
151
+ cities = City.find([@new_york.id, @san_francisco.slug])
143
152
 
144
153
  assert_equal 2, cities.length
145
154
  assert !cities[0].found_by_slug?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i76-has_slug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom-Eric Gerritsen