From d5293aeae258bd298a2d6d49134bca71cb00c6ed Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 13 Dec 2017 16:09:21 +0800 Subject: [PATCH] Clean `Topic#slug` when `SiteSetting.slug_generation_method` changes. https://meta.discourse.org/t/removing-the-concept-of-slugs-for-some-languages/26643/24?u=tgxworld --- app/models/topic.rb | 8 ++++++++ spec/models/topic_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/models/topic.rb b/app/models/topic.rb index 61000fa8a49..b6138ac975b 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -33,6 +33,14 @@ class Topic < ActiveRecord::Base attr_accessor :allowed_user_ids, :tags_changed + DiscourseEvent.on(:site_setting_saved) do |site_setting| + if site_setting.name.to_s == "slug_generation_method" && site_setting.saved_change_to_value? + Scheduler::Defer.later("Null topic slug") do + Topic.update_all(slug: nil) + end + end + end + def self.max_sort_order @max_sort_order ||= (2**31) - 1 end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 7134b101343..81cdd23a45c 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -201,6 +201,26 @@ describe Topic do end end end + + describe 'when updating SiteSetting.slug_generation_method' do + let(:title) { '熱帶風暴畫眉熱帶風暴畫眉熱帶風暴畫眉' } + let(:slug) { 'topic' } + + it 'should clear the slug' do + topic.save! + expect(topic.title).to eq(title) + expect(topic.slug).to eq(slug) + + begin + Scheduler::Defer.async = false + SiteSetting.update(name: 'slug_generation_method', value: 'encoded') + expect(topic.reload.read_attribute(:slug)).to eq(nil) + ensure + SiteSetting.where(name: 'slug_generation_method').destroy_all + Scheduler::Defer.async = true + end + end + end end context "updating a title to be shorter" do