diff --git a/app/controllers/category_hashtags_controller.rb b/app/controllers/category_hashtags_controller.rb
index b08d7f23ae9..b5a971fa805 100644
--- a/app/controllers/category_hashtags_controller.rb
+++ b/app/controllers/category_hashtags_controller.rb
@@ -9,7 +9,7 @@ class CategoryHashtagsController < ApplicationController
ids = category_slugs.map { |category_slug| Category.query_from_hashtag_slug(category_slug).try(:id) }
valid_categories = Category.secured(guardian).where(id: ids).map do |category|
- { slug: category.hashtag_slug, url: category.url_with_id }
+ { slug: category.hashtag_slug, url: category.url }
end.compact
render json: { valid: valid_categories }
diff --git a/app/models/category.rb b/app/models/category.rb
index d6375eb7144..cb51a03cc48 100644
--- a/app/models/category.rb
+++ b/app/models/category.rb
@@ -721,11 +721,13 @@ class Category < ActiveRecord::Base
end
def url
- @@url_cache[self.id] ||= "#{Discourse.base_uri}/c/#{slug_path.join('/')}"
+ @@url_cache[self.id] ||= "#{Discourse.base_uri}/c/#{slug_path.join('/')}/#{self.id}"
end
def url_with_id
- self.parent_category ? "#{url}/#{self.id}" : "#{Discourse.base_uri}/c/#{self.slug}/#{self.id}"
+ Discourse.deprecate("Category#url_with_id is deprecated. Use `Category#url` instead.", output_in_test: true)
+
+ url
end
# If the name changes, try and update the category definition topic too if it's an exact match
@@ -739,9 +741,10 @@ class Category < ActiveRecord::Base
def create_category_permalink
old_slug = saved_changes.transform_values(&:first)["slug"]
+
url = +"#{Discourse.base_uri}/c"
url << "/#{parent_category.slug_path.join('/')}" if parent_category_id
- url << "/#{old_slug}"
+ url << "/#{old_slug}/#{id}"
url = Permalink.normalize_url(url)
if Permalink.where(url: url).exists?
diff --git a/app/models/permalink.rb b/app/models/permalink.rb
index 9e1e2d1a4e2..ea317839e51 100644
--- a/app/models/permalink.rb
+++ b/app/models/permalink.rb
@@ -80,7 +80,7 @@ class Permalink < ActiveRecord::Base
return external_url if external_url
return "#{Discourse::base_uri}#{post.url}" if post
return topic.relative_url if topic
- return "#{category.url}/#{category.id}" if category
+ return category.url if category
return tag.full_url if tag
nil
end
diff --git a/app/models/topic_list.rb b/app/models/topic_list.rb
index d51c0f153f3..52b0ee00708 100644
--- a/app/models/topic_list.rb
+++ b/app/models/topic_list.rb
@@ -67,7 +67,7 @@ class TopicList
def preload_key
if @category
- "topic_list_#{@category.url.sub(/^\//, '')}/#{@category.id}/l/#{@filter}"
+ "topic_list_#{@category.url.sub(/^\//, '')}/l/#{@filter}"
else
"topic_list_#{@filter}"
end
diff --git a/lib/pretty_text/helpers.rb b/lib/pretty_text/helpers.rb
index d207e01eed6..9633a4e8eaf 100644
--- a/lib/pretty_text/helpers.rb
+++ b/lib/pretty_text/helpers.rb
@@ -41,7 +41,7 @@ module PrettyText
def category_hashtag_lookup(category_slug)
if category = Category.query_from_hashtag_slug(category_slug)
- [category.url_with_id, category_slug]
+ [category.url, category_slug]
else
nil
end
@@ -106,7 +106,7 @@ module PrettyText
is_tag = text =~ /#{tag_postfix}$/
if !is_tag && category = Category.query_from_hashtag_slug(text)
- [category.url_with_id, text]
+ [category.url, text]
elsif (!is_tag && tag = Tag.find_by(name: text)) ||
(is_tag && tag = Tag.find_by(name: text.gsub!("#{tag_postfix}", '')))
["#{Discourse.base_url}/tag/#{tag.name}", text]
diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb
index 49a3ac90baa..823fb8900c2 100644
--- a/spec/components/pretty_text_spec.rb
+++ b/spec/components/pretty_text_spec.rb
@@ -1106,9 +1106,9 @@ describe PrettyText do
[
"#unknown::tag",
- "#known",
+ "#known",
"#known",
- "#testing"
+ "#testing"
].each do |element|
expect(cooked).to include(element)
diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb
index 7b550a9c1d3..f122673c0a9 100644
--- a/spec/models/category_spec.rb
+++ b/spec/models/category_spec.rb
@@ -430,7 +430,7 @@ describe Category do
end
it "reuses existing permalink when category slug is changed" do
- permalink = Permalink.create!(url: "c/#{@category.slug}", category_id: 42)
+ permalink = Permalink.create!(url: "c/#{@category.slug}/#{@category.id}", category_id: 42)
expect { @category.update(slug: 'new-slug') }.to_not change { Permalink.count }
expect(permalink.reload.category_id).to eq(@category.id)
@@ -695,47 +695,20 @@ describe Category do
describe "for normal categories" do
it "builds a url" do
- expect(category.url).to eq("/c/root")
+ expect(category.url).to eq("/c/root/#{category.id}")
end
end
describe "for subcategories" do
it "builds a url" do
- expect(sub_category.url).to eq("/c/root/child")
+ expect(sub_category.url).to eq("/c/root/child/#{sub_category.id}")
end
end
describe "for sub-sub-categories" do
it "builds a url" do
expect(sub_sub_category.url)
- .to eq("/c/root/child/child-of-child")
- end
- end
- end
-
- describe "#url_with_id" do
- fab!(:category) do
- Fabricate(
- :category_with_definition,
- name: 'cats',
- )
- end
-
- it "includes the id in the URL" do
- expect(category.url_with_id).to eq("/c/cats/#{category.id}")
- end
-
- context "child category" do
- fab!(:child_category) do
- Fabricate(
- :category,
- parent_category_id: category.id,
- name: 'dogs',
- )
- end
-
- it "includes the id in the URL" do
- expect(child_category.url_with_id).to eq("/c/cats/dogs/#{child_category.id}")
+ .to eq("/c/root/child/child-of-child/#{sub_sub_category.id}")
end
end
end
diff --git a/spec/models/permalink_spec.rb b/spec/models/permalink_spec.rb
index 869d38fba5f..709768e5d03 100644
--- a/spec/models/permalink_spec.rb
+++ b/spec/models/permalink_spec.rb
@@ -63,7 +63,7 @@ describe Permalink do
it "returns a category url when category_id is set" do
permalink.category_id = category.id
- expect(target_url).to eq("#{category.url}/#{category.id}")
+ expect(target_url).to eq("#{category.url}")
end
it "returns nil when category_id is set but category is not found" do
diff --git a/spec/requests/categories_controller_spec.rb b/spec/requests/categories_controller_spec.rb
index a4825fb101a..d920723b145 100644
--- a/spec/requests/categories_controller_spec.rb
+++ b/spec/requests/categories_controller_spec.rb
@@ -13,7 +13,7 @@ describe CategoriesController do
get '/categories', headers: { 'HTTP_USER_AGENT' => 'Googlebot' }
html = Nokogiri::HTML5(response.body)
expect(html.css('body.crawler')).to be_present
- expect(html.css("a[href=\"/forum/c/#{category.slug}\"]")).to be_present
+ expect(html.css("a[href=\"/forum/c/#{category.slug}/#{category.id}\"]")).to be_present
end
it "properly preloads topic list" do
diff --git a/spec/requests/category_hashtags_controller_spec.rb b/spec/requests/category_hashtags_controller_spec.rb
index f2f62a82ea1..7676ba56423 100644
--- a/spec/requests/category_hashtags_controller_spec.rb
+++ b/spec/requests/category_hashtags_controller_spec.rb
@@ -18,7 +18,7 @@ describe CategoryHashtagsController do
expect(response.status).to eq(200)
expect(response.parsed_body).to eq(
- "valid" => [{ "slug" => category.hashtag_slug, "url" => category.url_with_id }]
+ "valid" => [{ "slug" => category.hashtag_slug, "url" => category.url }]
)
end
@@ -45,7 +45,7 @@ describe CategoryHashtagsController do
expect(response.status).to eq(200)
expect(response.parsed_body).to eq(
- "valid" => [{ "slug" => private_category.hashtag_slug, "url" => private_category.url_with_id }]
+ "valid" => [{ "slug" => private_category.hashtag_slug, "url" => private_category.url }]
)
end
end