diff --git a/app/models/alchemy/page/page_naming.rb b/app/models/alchemy/page/page_naming.rb index 940b12ea86..8f21a0672b 100644 --- a/app/models/alchemy/page/page_naming.rb +++ b/app/models/alchemy/page/page_naming.rb @@ -25,6 +25,8 @@ module PageNaming after_update :update_descendants_urlnames, if: :saved_change_to_urlname? + before_save :destroy_obsolete_legacy_urls, if: :renamed? + after_move :update_urlname! end @@ -55,6 +57,11 @@ def update_descendants_urlnames descendants.each(&:update_urlname!) end + def destroy_obsolete_legacy_urls + obsolete_legacy_urls = legacy_urls.select { |legacy_url| legacy_url.urlname == urlname } + legacy_urls.destroy(obsolete_legacy_urls) + end + # Sets the urlname to a url friendly slug. # Either from name, or if present, from urlname. # The urlname contains the whole path including parent urlnames. diff --git a/spec/models/alchemy/page_spec.rb b/spec/models/alchemy/page_spec.rb index 25c6f04954..17e6de4cd7 100644 --- a/spec/models/alchemy/page_spec.rb +++ b/spec/models/alchemy/page_spec.rb @@ -1689,6 +1689,18 @@ def copy_children_to(new_parent) expect(page.legacy_urls.pluck(:urlname)).to include("parentparent/parent/page") end end + + context "if new urlname exists as a legacy url" do + it "will delete obsolete legacy_urls" do + expect(page.urlname).to eq("parentparent/parent/page") + page.update!(urlname: "other-name") + expect(page.legacy_urls.pluck(:urlname)).to include("parentparent/parent/page") + page.update!(urlname: "page") + expect(page.legacy_urls.pluck(:urlname)).to include("parentparent/parent/other-name") + expect(page.urlname).to eq("parentparent/parent/page") + expect(page.legacy_urls.pluck(:urlname)).not_to include("parentparent/parent/page") + end + end end describe "#update_node!" do