friendly_id 1.9.9 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +5 -4
- data/Manifest.txt +1 -10
- data/README.rdoc +13 -8
- data/Rakefile +5 -3
- data/friendly_id.gemspec +3 -3
- data/lib/friendly_id.rb +15 -8
- data/lib/friendly_id/helpers.rb +13 -0
- data/lib/friendly_id/non_sluggable_class_methods.rb +14 -15
- data/lib/friendly_id/slug.rb +2 -3
- data/lib/friendly_id/sluggable_class_methods.rb +3 -9
- data/lib/friendly_id/sluggable_instance_methods.rb +18 -18
- data/lib/friendly_id/version.rb +3 -3
- data/lib/tasks/friendly_id.rake +1 -1
- data/test/fixtures/posts.yml +5 -1
- data/test/fixtures/slugs.yml +8 -0
- data/test/non_slugged_test.rb +29 -7
- data/test/sluggable_test.rb +4 -0
- metadata +16 -14
- metadata.gz.sig +0 -0
- data/coverage/index.html +0 -409
- data/coverage/lib-friendly_id-non_sluggable_class_methods_rb.html +0 -646
- data/coverage/lib-friendly_id-non_sluggable_instance_methods_rb.html +0 -638
- data/coverage/lib-friendly_id-shoulda_macros_rb.html +0 -641
- data/coverage/lib-friendly_id-sluggable_class_methods_rb.html +0 -714
- data/coverage/lib-friendly_id-sluggable_instance_methods_rb.html +0 -710
- data/coverage/lib-friendly_id-string_helpers_rb.html +0 -685
- data/coverage/lib-friendly_id_rb.html +0 -665
- data/coverage/lib-slug_rb.html +0 -695
- data/coverage/rails-init_rb.html +0 -606
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
==
|
1
|
+
== 2.0.0 2009-01-03
|
2
2
|
|
3
|
-
*
|
3
|
+
* 5 major enhancements:
|
4
4
|
* Support for scoped slugs (Norman Clarke)
|
5
5
|
* Support for UTF-8 friendly_ids (Norman Clarke)
|
6
6
|
* Can now be installed via Ruby Gems, or as a Rails plugin (Norman Clarke)
|
7
|
-
* Shoulda macro ({Josh Nichols}[http://github.com/technicalpickles])
|
8
7
|
* Improved handling of non-unique slugs (Norman Clarke and Adrian Mugnolo)
|
9
|
-
|
8
|
+
* 2 minor enhancements:
|
9
|
+
* Shoulda macro (Josh Nichols - http://github.com/technicalpickles)
|
10
|
+
* Various small bugfixes, cleanups and refactorings
|
10
11
|
|
11
12
|
== 2008-12-01
|
12
13
|
|
data/Manifest.txt
CHANGED
@@ -3,16 +3,6 @@ MIT-LICENSE
|
|
3
3
|
Manifest.txt
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
|
-
coverage/index.html
|
7
|
-
coverage/lib-friendly_id-non_sluggable_class_methods_rb.html
|
8
|
-
coverage/lib-friendly_id-non_sluggable_instance_methods_rb.html
|
9
|
-
coverage/lib-friendly_id-shoulda_macros_rb.html
|
10
|
-
coverage/lib-friendly_id-sluggable_class_methods_rb.html
|
11
|
-
coverage/lib-friendly_id-sluggable_instance_methods_rb.html
|
12
|
-
coverage/lib-friendly_id-string_helpers_rb.html
|
13
|
-
coverage/lib-friendly_id_rb.html
|
14
|
-
coverage/lib-slug_rb.html
|
15
|
-
coverage/rails-init_rb.html
|
16
6
|
friendly_id.gemspec
|
17
7
|
generators/friendly_id/friendly_id_generator.rb
|
18
8
|
generators/friendly_id/templates/create_slugs.rb
|
@@ -20,6 +10,7 @@ generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb
|
|
20
10
|
generators/friendly_id_20_upgrade/templates/upgrade_friendly_id_to_20.rb
|
21
11
|
init.rb
|
22
12
|
lib/friendly_id.rb
|
13
|
+
lib/friendly_id/helpers.rb
|
23
14
|
lib/friendly_id/non_sluggable_class_methods.rb
|
24
15
|
lib/friendly_id/non_sluggable_instance_methods.rb
|
25
16
|
lib/friendly_id/shoulda_macros.rb
|
data/README.rdoc
CHANGED
@@ -213,12 +213,18 @@ that uses a non-Roman writing system, your feedback would be most welcome.
|
|
213
213
|
|
214
214
|
FriendlyId is installed as a Ruby Gem:
|
215
215
|
|
216
|
-
gem install
|
216
|
+
gem install friendly_id
|
217
217
|
|
218
218
|
Alternatively, you can install it as a Rails plugin, though this is
|
219
219
|
discouraged:
|
220
220
|
|
221
|
-
./script/plugin install git://github.com/norman/friendly_id.git
|
221
|
+
./script/plugin install git://github.com/norman/friendly_id.git
|
222
|
+
|
223
|
+
If you are installing as a plugin, make sure you have installed the unicode gem,
|
224
|
+
which FriendlyId depends on:
|
225
|
+
|
226
|
+
gem install unicode
|
227
|
+
|
222
228
|
|
223
229
|
== Setting it up
|
224
230
|
|
@@ -226,7 +232,7 @@ FriendlyId currently works with Rails 2.0.0 and higher. Here's how to set it up.
|
|
226
232
|
|
227
233
|
1) Install the Gem:
|
228
234
|
|
229
|
-
sudo gem install
|
235
|
+
sudo gem install friendly_id
|
230
236
|
cd my_app
|
231
237
|
script/generate friendly_id
|
232
238
|
rake db:migrate
|
@@ -264,15 +270,15 @@ rake:friendly_id:remove_old_slugs MODEL=MyModelName DAYS=60
|
|
264
270
|
If you installed an older version of FriendlyId and want to upgrade to 2.0,
|
265
271
|
follow these steps:
|
266
272
|
|
267
|
-
==== Install the
|
273
|
+
==== Install the friendly_id Gem:
|
274
|
+
|
275
|
+
sudo gem install friendly_id
|
268
276
|
|
269
|
-
sudo gem install friendly-id
|
270
|
-
|
271
277
|
==== Add FriendlyId to environment.rb:
|
272
278
|
|
273
279
|
===== For Rails 2.1 and higher:
|
274
280
|
|
275
|
-
config.gem "friendly_id"
|
281
|
+
config.gem "friendly_id"
|
276
282
|
|
277
283
|
===== For Rails 2.0:
|
278
284
|
|
@@ -293,7 +299,6 @@ Add this to the bottom of environment.rb:
|
|
293
299
|
|
294
300
|
That's it!
|
295
301
|
|
296
|
-
|
297
302
|
== Hacking FriendlyId:
|
298
303
|
|
299
304
|
FriendlyId is {hosted on Github}[git://github.com/norman/friendly_id.git], and
|
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), 'lib', 'friendly_id', 'version')
|
1
|
+
require 'newgem'
|
2
|
+
require 'lib/friendly_id/version'
|
4
3
|
|
5
4
|
Hoe.new("friendly_id", FriendlyId::Version::STRING) do |p|
|
6
5
|
p.rubyforge_name = "friendly-id"
|
@@ -13,6 +12,9 @@ Hoe.new("friendly_id", FriendlyId::Version::STRING) do |p|
|
|
13
12
|
p.need_zip = true
|
14
13
|
p.test_globs = ['test/**/*_test.rb']
|
15
14
|
p.extra_deps << ['unicode', '>= 0.1']
|
15
|
+
p.extra_dev_deps = [
|
16
|
+
['newgem', ">= #{::Newgem::VERSION}"]
|
17
|
+
]
|
16
18
|
p.rdoc_pattern = /^(lib|bin|ext)|txt|rdoc$/
|
17
19
|
changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
18
20
|
p.remote_rdoc_dir = ""
|
data/friendly_id.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{friendly_id}
|
3
|
-
s.version = "
|
3
|
+
s.version = "2.0.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Norman Clarke", "Adrian Mugnolo", "Emilio Tagua"]
|
7
7
|
s.cert_chain = ["/Users/norman/.gem/gem-public_cert.pem"]
|
8
|
-
s.date = %q{2008-12-
|
8
|
+
s.date = %q{2008-12-30}
|
9
9
|
s.description = %q{A comprehensive slugging and pretty-URL plugin for Ruby on Rails.}
|
10
10
|
s.email = ["norman@randomba.org", "adrian@randomba.org", "miloops@gmail.com"]
|
11
11
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
|
12
|
-
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "
|
12
|
+
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "friendly_id.gemspec", "generators/friendly_id/friendly_id_generator.rb", "generators/friendly_id/templates/create_slugs.rb", "generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb", "generators/friendly_id_20_upgrade/templates/upgrade_friendly_id_to_20.rb", "init.rb", "lib/friendly_id.rb", "lib/friendly_id/helpers.rb", "lib/friendly_id/non_sluggable_class_methods.rb", "lib/friendly_id/non_sluggable_instance_methods.rb", "lib/friendly_id/shoulda_macros.rb", "lib/friendly_id/slug.rb", "lib/friendly_id/sluggable_class_methods.rb", "lib/friendly_id/sluggable_instance_methods.rb", "lib/friendly_id/version.rb", "lib/tasks/friendly_id.rake", "lib/tasks/friendly_id.rb", "test/database.yml", "test/fixtures/countries.yml", "test/fixtures/country.rb", "test/fixtures/people.yml", "test/fixtures/person.rb", "test/fixtures/post.rb", "test/fixtures/posts.yml", "test/fixtures/slugs.yml", "test/fixtures/user.rb", "test/fixtures/users.yml", "test/non_slugged_test.rb", "test/rails/2.x/app/controllers/application.rb", "test/rails/2.x/config/boot.rb", "test/rails/2.x/config/database.yml", "test/rails/2.x/config/environment.rb", "test/rails/2.x/config/environments/test.rb", "test/rails/2.x/config/routes.rb", "test/schema.rb", "test/scoped_model_test.rb", "test/slug_test.rb", "test/sluggable_test.rb", "test/test_helper.rb"]
|
13
13
|
s.has_rdoc = true
|
14
14
|
s.homepage = %q{http://randomba.org}
|
15
15
|
s.rdoc_options = ["--main", "README.txt"]
|
data/lib/friendly_id.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
require 'unicode'
|
2
|
+
require 'friendly_id/helpers'
|
2
3
|
require 'friendly_id/slug'
|
3
4
|
require 'friendly_id/shoulda_macros'
|
4
5
|
|
6
|
+
|
5
7
|
# FriendlyId is a comprehensize Rails plugin/gem for slugging and permalinks.
|
6
8
|
module FriendlyId
|
7
9
|
|
8
|
-
# Load FriendlyId if the gem is included in a Rails app.
|
9
|
-
def self.enable
|
10
|
-
return if ActiveRecord::Base.methods.include? 'has_friendly_id'
|
11
|
-
ActiveRecord::Base.class_eval { extend FriendlyId::ClassMethods }
|
12
|
-
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
13
|
-
end
|
14
|
-
|
15
10
|
# This error is raised when it's not possible to generate a unique slug.
|
16
11
|
class SlugGenerationError < StandardError ; end
|
17
12
|
|
@@ -38,7 +33,7 @@ module FriendlyId
|
|
38
33
|
class_inheritable_reader :friendly_id_options
|
39
34
|
|
40
35
|
if options[:use_slug]
|
41
|
-
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy
|
36
|
+
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy, :readonly => true
|
42
37
|
require 'friendly_id/sluggable_class_methods'
|
43
38
|
require 'friendly_id/sluggable_instance_methods'
|
44
39
|
extend SluggableClassMethods
|
@@ -54,6 +49,18 @@ module FriendlyId
|
|
54
49
|
|
55
50
|
end
|
56
51
|
|
52
|
+
class << self
|
53
|
+
|
54
|
+
# Load FriendlyId if the gem is included in a Rails app.
|
55
|
+
def enable
|
56
|
+
return if ActiveRecord::Base.methods.include? 'has_friendly_id'
|
57
|
+
ActiveRecord::Base.class_eval { extend FriendlyId::ClassMethods }
|
58
|
+
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
|
57
64
|
end
|
58
65
|
|
59
66
|
if defined?(ActiveRecord)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FriendlyId
|
2
|
+
|
3
|
+
module Helpers
|
4
|
+
# Calculate expected result size for find_some_with_friendly (taken from
|
5
|
+
# active_record/base.rb)
|
6
|
+
def expected_size(ids_and_names, options) #:nodoc:#
|
7
|
+
size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
8
|
+
size = options[:limit] if options[:limit] && size > options[:limit]
|
9
|
+
size
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module FriendlyId::NonSluggableClassMethods
|
2
2
|
|
3
|
+
include FriendlyId::Helpers
|
4
|
+
|
3
5
|
def self.extended(base) #:nodoc:#
|
4
6
|
class << base
|
5
7
|
alias_method_chain :find_one, :friendly
|
@@ -19,23 +21,20 @@ module FriendlyId::NonSluggableClassMethods
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def find_some_with_friendly(ids_and_names, options) #:nodoc:#
|
22
|
-
|
23
|
-
|
24
|
+
|
25
|
+
results = with_scope :find => options do
|
26
|
+
find :all, :conditions => ["#{ quoted_table_name }.#{ primary_key } IN (?) OR #{friendly_id_options[:column].to_s} IN (?)",
|
27
|
+
ids_and_names, ids_and_names]
|
24
28
|
end
|
29
|
+
|
30
|
+
expected = expected_size(ids_and_names, options)
|
31
|
+
if results.size != expected
|
32
|
+
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected })"
|
33
|
+
end
|
34
|
+
|
35
|
+
results.each {|r| r.send(:found_using_friendly_id=, true) if ids_and_names.include?(r.friendly_id)}
|
25
36
|
|
26
|
-
ids = ids_and_names - results_by_name.map { |r| r[ friendly_id_options[:column] ] }
|
27
|
-
results = results_by_name
|
28
|
-
|
29
|
-
results += with_scope :find => options do
|
30
|
-
find :all, :conditions => ["#{ quoted_table_name }.#{ primary_key } IN (?)", ids]
|
31
|
-
end unless ids.empty?
|
32
|
-
|
33
|
-
expected_size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
34
|
-
expected_size = options[:limit] if options[:limit] && expected_size > options[:limit]
|
35
|
-
|
36
|
-
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected_size })" if results.size != expected_size
|
37
|
-
|
38
|
-
results_by_name.each { |r| r.send(:found_using_friendly_id=, true) }
|
39
37
|
results
|
38
|
+
|
40
39
|
end
|
41
40
|
end
|
data/lib/friendly_id/slug.rb
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
class Slug < ActiveRecord::Base
|
3
3
|
|
4
4
|
belongs_to :sluggable, :polymorphic => true
|
5
|
-
|
6
|
-
before_create :set_sequence
|
7
|
-
before_save :check_for_blank_name
|
5
|
+
before_save :check_for_blank_name, :set_sequence
|
8
6
|
|
9
7
|
class << self
|
10
8
|
|
@@ -81,6 +79,7 @@ class Slug < ActiveRecord::Base
|
|
81
79
|
end
|
82
80
|
|
83
81
|
def set_sequence
|
82
|
+
return unless new_record?
|
84
83
|
last = Slug.find(:first, :conditions => { :name => name, :scope => scope,
|
85
84
|
:sluggable_type => sluggable_type}, :order => "sequence DESC",
|
86
85
|
:select => 'sequence')
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module FriendlyId::SluggableClassMethods
|
2
|
+
|
3
|
+
include FriendlyId::Helpers
|
2
4
|
|
3
5
|
def self.extended(base) #:nodoc:#
|
4
6
|
|
@@ -48,11 +50,10 @@ module FriendlyId::SluggableClassMethods
|
|
48
50
|
find_options = {:select => "#{self.table_name}.*"}
|
49
51
|
find_options[:joins] = :slugs unless options[:include] && [*options[:include]].flatten.include?(:slugs)
|
50
52
|
find_options[:conditions] = "#{quoted_table_name}.#{primary_key} IN (#{ids.empty? ? 'NULL' : ids.join(',')}) "
|
51
|
-
find_options[:conditions] << "OR
|
53
|
+
find_options[:conditions] << "OR slugs.id IN (#{slugs.to_s(:db)})"
|
52
54
|
|
53
55
|
results = with_scope(:find => find_options) { find_every(options) }
|
54
56
|
|
55
|
-
# calculate expected size, taken from active_record/base.rb
|
56
57
|
expected = expected_size(ids_and_names, options)
|
57
58
|
if results.size != expected
|
58
59
|
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected })"
|
@@ -79,13 +80,6 @@ module FriendlyId::SluggableClassMethods
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
|
-
# Calculate expected result size for find_some_with_friendly
|
83
|
-
def expected_size(ids_and_names, options) #:nodoc:#
|
84
|
-
size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
85
|
-
size = options[:limit] if options[:limit] && size > options[:limit]
|
86
|
-
size
|
87
|
-
end
|
88
|
-
|
89
83
|
# Build arrays of slugs and ids, for the find_some_with_friendly method.
|
90
84
|
def get_slugs_and_ids(ids_and_names, options) #:nodoc:#
|
91
85
|
scope = options.delete(:scope)
|
@@ -53,23 +53,6 @@ module FriendlyId::SluggableInstanceMethods
|
|
53
53
|
slug ? slug.to_friendly_id : id.to_s
|
54
54
|
end
|
55
55
|
|
56
|
-
# Set the slug using the generated friendly id.
|
57
|
-
def set_slug
|
58
|
-
if self.class.friendly_id_options[:use_slug] && new_slug_needed?
|
59
|
-
@most_recent_slug = nil
|
60
|
-
slug_attributes = {:name => slug_text}
|
61
|
-
if friendly_id_options[:scope]
|
62
|
-
scope = send(friendly_id_options[:scope])
|
63
|
-
slug_attributes[:scope] = scope.respond_to?(:to_param) ? scope.to_param : scope.to_s
|
64
|
-
end
|
65
|
-
# If we're renaming back to a previously used friendly_id, delete the
|
66
|
-
# slug so that we can recycle the name without having to use a sequence.
|
67
|
-
slugs.find(:all, :conditions => {:name => slug_text, :scope => scope}).each { |s| s.destroy }
|
68
|
-
s = slugs.build slug_attributes
|
69
|
-
s.send(:set_sequence)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
56
|
# Get the processed string used as the basis of the friendly id.
|
74
57
|
def slug_text
|
75
58
|
base = send friendly_id_options[:column]
|
@@ -98,8 +81,25 @@ module FriendlyId::SluggableInstanceMethods
|
|
98
81
|
|
99
82
|
def init_finder_slug
|
100
83
|
return false if !@finder_slug_name
|
101
|
-
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => @finder_slug_name})
|
84
|
+
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => @finder_slug_name, :sluggable_type => self.class.name })
|
102
85
|
finder_slug = slug
|
103
86
|
end
|
104
87
|
|
88
|
+
# Set the slug using the generated friendly id.
|
89
|
+
def set_slug
|
90
|
+
if self.class.friendly_id_options[:use_slug] && new_slug_needed?
|
91
|
+
@most_recent_slug = nil
|
92
|
+
slug_attributes = {:name => slug_text}
|
93
|
+
if friendly_id_options[:scope]
|
94
|
+
scope = send(friendly_id_options[:scope])
|
95
|
+
slug_attributes[:scope] = scope.respond_to?(:to_param) ? scope.to_param : scope.to_s
|
96
|
+
end
|
97
|
+
# If we're renaming back to a previously used friendly_id, delete the
|
98
|
+
# slug so that we can recycle the name without having to use a sequence.
|
99
|
+
slugs.find(:all, :conditions => {:name => slug_text, :scope => scope}).each { |s| s.destroy }
|
100
|
+
slug = slugs.build slug_attributes
|
101
|
+
slug
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
105
|
end
|
data/lib/friendly_id/version.rb
CHANGED
data/lib/tasks/friendly_id.rake
CHANGED
@@ -8,7 +8,7 @@ namespace :friendly_id do
|
|
8
8
|
while records = sluggable_class.find(:all, :include => :slugs, :conditions => "slugs.id IS NULL", :limit => 1000) do
|
9
9
|
break if records.size == 0
|
10
10
|
records.each do |r|
|
11
|
-
r.set_slug
|
11
|
+
r.send(:set_slug)
|
12
12
|
r.save!
|
13
13
|
puts "#{sluggable_class.to_s}(#{r.id}) friendly_id set to \"#{r.slug.name}\""
|
14
14
|
end
|
data/test/fixtures/posts.yml
CHANGED
@@ -16,4 +16,8 @@ common_title:
|
|
16
16
|
|
17
17
|
common_title2:
|
18
18
|
name: Common Title
|
19
|
-
content: A second post with a very common title
|
19
|
+
content: A second post with a very common title
|
20
|
+
|
21
|
+
john_smith:
|
22
|
+
name: John Smith
|
23
|
+
content: Should allow for identical slug names between sluggable types
|
data/test/fixtures/slugs.yml
CHANGED
data/test/non_slugged_test.rb
CHANGED
@@ -11,24 +11,39 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
11
11
|
assert User.find(users(:joe).friendly_id)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def test_should_find_users_using_friendly_id
|
15
|
+
assert User.find([users(:joe).friendly_id])
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
assert_equal
|
18
|
+
def test_to_param_should_return_a_string
|
19
|
+
assert_equal String, users(:joe).to_param.class
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_should_not_find_users_using_non_existent_friendly_ids
|
23
23
|
assert_raises ActiveRecord::RecordNotFound do
|
24
|
-
User.find(['
|
24
|
+
User.find(['bad', 'bad2'])
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def test_finding_by_array_with_friendly_and_non_friendly_id_for_same_record_raises_error
|
29
|
+
assert_raises ActiveRecord::RecordNotFound do
|
30
|
+
User.find([users(:joe).id, "joe"]).size
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_finding_with_mixed_array_should_indicate_whether_found_by_numeric_or_friendly
|
35
|
+
@users = User.find([users(:jane).id, "joe"], :order => "login ASC")
|
36
|
+
assert @users[0].found_using_numeric_id?
|
37
|
+
assert @users[1].found_using_friendly_id?
|
38
|
+
end
|
27
39
|
|
28
40
|
def test_finder_options_are_not_ignored
|
29
41
|
assert_raises ActiveRecord::RecordNotFound do
|
30
42
|
User.find(users(:joe).friendly_id, :conditions => "1 = 2")
|
31
43
|
end
|
44
|
+
assert_raises ActiveRecord::RecordNotFound do
|
45
|
+
User.find([users(:joe).friendly_id], :conditions => "1 = 2")
|
46
|
+
end
|
32
47
|
end
|
33
48
|
|
34
49
|
def test_user_should_have_friendly_id_options
|
@@ -36,8 +51,12 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
36
51
|
end
|
37
52
|
|
38
53
|
def test_user_should_not_be_found_using_friendly_id_unless_it_really_was
|
39
|
-
|
40
|
-
|
54
|
+
assert !User.find(users(:joe).id).found_using_friendly_id?
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_users_should_not_be_found_using_friendly_id_unless_they_really_were
|
58
|
+
@users = User.find([users(:jane).id])
|
59
|
+
assert @users[0].found_using_numeric_id?
|
41
60
|
end
|
42
61
|
|
43
62
|
def test_user_should_be_considered_found_by_numeric_id_as_default
|
@@ -48,15 +67,18 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
48
67
|
def test_user_should_indicate_if_it_was_found_using_numeric_id
|
49
68
|
@user = User.find(users(:joe).id)
|
50
69
|
assert @user.found_using_numeric_id?
|
70
|
+
assert !@user.found_using_friendly_id?
|
51
71
|
end
|
52
72
|
|
53
73
|
def test_user_should_indicate_if_it_was_found_using_friendly_id
|
54
74
|
@user = User.find(users(:joe).friendly_id)
|
75
|
+
assert !@user.found_using_numeric_id?
|
55
76
|
assert @user.found_using_friendly_id?
|
56
77
|
end
|
57
78
|
|
58
79
|
def test_should_indicate_there_is_a_better_id_if_found_by_numeric_id
|
59
80
|
@user = User.find(users(:joe).id)
|
81
|
+
assert @user.found_using_numeric_id?
|
60
82
|
assert @user.has_better_id?
|
61
83
|
end
|
62
84
|
|