Skip to content

Commit

Permalink
Merge pull request #513 from PikachuEXE/fix/scoped-slug-regeneration
Browse files Browse the repository at this point in the history
Fix/scoped slug regeneration
  • Loading branch information
norman committed Jan 28, 2014
2 parents b7d2b0c + b5bf8f7 commit cc1e1bc
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 6 deletions.
6 changes: 3 additions & 3 deletions lib/friendly_id/scoped.rb
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,13 @@ def scope_for_slug_generator
relation = relation.where(column => send(column))
end
if changed.include?(friendly_id_config.slug_column)
column = self.class.quoted_table_name + '.' + self.class.quoted_primary_key
relation = relation.where("#{column} <> ?", send(self.class.primary_key))
primary_key_name = self.class.primary_key
relation = relation.where.not(primary_key_name => send(primary_key_name))
end
relation
end
private :scope_for_slug_generator

def slug_generator
friendly_id_config.slug_generator_class.new(scope_for_slug_generator)
end
Expand Down
4 changes: 2 additions & 2 deletions lib/friendly_id/slugged.rb
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,8 @@ def scope_for_slug_generator
scope = scope.friendly unless friendly_id_config.uses? :finders

if changed.include?(friendly_id_config.slug_column)
column = self.class.quoted_table_name + '.' + self.class.quoted_primary_key
scope = scope.where("#{column} <> ?", send(self.class.primary_key))
primary_key_name = self.class.primary_key
scope = scope.where.not(primary_key_name => send(primary_key_name))
end
scope
end
Expand Down
34 changes: 34 additions & 0 deletions test/scoped_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ class Novel < ActiveRecord::Base
belongs_to :novelist
belongs_to :publisher
friendly_id :name, :use => :scoped, :scope => [:publisher, :novelist]

def should_generate_new_friendly_id?
new_record? || super
end
end

class Publisher < ActiveRecord::Base
Expand Down Expand Up @@ -54,6 +58,36 @@ def model_class
end
end

test "should not allow duplicate slugs inside scope after regeneration for persisted record" do
with_instance_of Novelist do |novelist|
novel1 = Novel.create! :name => "a", :novelist => novelist
novel2 = Novel.new :name => "a", :novelist => novelist
novel2.save!

novel2.send(:set_slug)
first_generated_friendly_id = novel2.friendly_id
novel2.send(:set_slug)
second_generated_friendly_id = novel2.friendly_id

assert novel1.friendly_id != novel2.friendly_id
end
end

test "should not allow duplicate slugs inside scope after regeneration for new record" do
with_instance_of Novelist do |novelist|
novel1 = Novel.create! :name => "a", :novelist => novelist
novel2 = Novel.new :name => "a", :novelist => novelist

novel2.send(:set_slug)
first_generated_friendly_id = novel2.friendly_id
novel2.send(:set_slug)
second_generated_friendly_id = novel2.friendly_id
novel2.save!

assert novel1.friendly_id != novel2.friendly_id
end
end

test "should apply scope with multiple columns" do
transaction do
novelist = Novelist.create! :name => "a"
Expand Down
31 changes: 30 additions & 1 deletion test/slugged_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,35 @@ def model_class
end
end

test "should not allow duplicate slugs after regeneration for persisted record" do
transaction do
model1 = model_class.create! :name => "a"
model2 = model_class.new :name => "a"
model2.save!

model2.send(:set_slug)
first_generated_friendly_id = model2.friendly_id
model2.send(:set_slug)
second_generated_friendly_id = model2.friendly_id

assert model1.friendly_id != model2.friendly_id
end
end

test "should not allow duplicate slugs after regeneration for new record" do
transaction do
model1 = model_class.create! :name => "a"
model2 = model_class.new :name => "a"

model2.send(:set_slug)
first_generated_friendly_id = model2.friendly_id
model2.send(:set_slug)
second_generated_friendly_id = model2.friendly_id

assert model1.friendly_id != model2.friendly_id
end
end

end

class SlugSeparatorTest < MiniTest::Unit::TestCase
Expand Down Expand Up @@ -220,7 +249,7 @@ class MenuItem < ActiveRecord::Base
friendly_id :name, :use => :slugged
before_create :init_primary_key

def self.primary_key
def self.primary_key
"string_key"
end

Expand Down

0 comments on commit cc1e1bc

Please sign in to comment.