FIX: allow array values for custom fields in category params. (#17692)

Previously, when we used `params[:custom_fields].try(:keys)` code it worked for all the custom fields unless it's an array. It created the problem in the discourse-restricted-replies plugin.

https://github.com/discourse/discourse-restricted-replies/pull/37#issuecomment-1194207693
This commit is contained in:
Vinoth Kannan
2022-07-28 07:53:35 +05:30
committed by GitHub
parent ff78a1eca7
commit 72b24f3fb9
2 changed files with 13 additions and 3 deletions

View File

@ -371,7 +371,7 @@ class CategoriesController < ApplicationController
:read_only_banner, :read_only_banner,
:default_list_filter, :default_list_filter,
:reviewable_by_group_id, :reviewable_by_group_id,
custom_fields: [params[:custom_fields].try(:keys)], custom_fields: [custom_field_params],
permissions: [*p.try(:keys)], permissions: [*p.try(:keys)],
allowed_tags: [], allowed_tags: [],
allowed_tag_groups: [], allowed_tag_groups: [],
@ -386,6 +386,15 @@ class CategoriesController < ApplicationController
end end
end end
def custom_field_params
keys = params[:custom_fields].try(:keys)
return if keys.blank?
keys.map do |key|
params[:custom_fields][key].is_a?(Array) ? { key => [] } : key
end
end
def fetch_category def fetch_category
@category = Category.find_by_slug(params[:id]) || Category.find_by(id: params[:id].to_i) @category = Category.find_by_slug(params[:id]) || Category.find_by(id: params[:id].to_i)
raise Discourse::NotFound if @category.blank? raise Discourse::NotFound if @category.blank?

View File

@ -520,7 +520,8 @@ describe CategoriesController do
"staff" => create_post "staff" => create_post
}, },
custom_fields: { custom_fields: {
"dancing" => "frogs" "dancing" => "frogs",
"running" => ["turtle", "salamander"]
}, },
minimum_required_tags: "", minimum_required_tags: "",
allow_global_tags: 'true', allow_global_tags: 'true',
@ -539,7 +540,7 @@ describe CategoriesController do
expect(category.slug).to eq("hello-category") expect(category.slug).to eq("hello-category")
expect(category.color).to eq("ff0") expect(category.color).to eq("ff0")
expect(category.auto_close_hours).to eq(72) expect(category.auto_close_hours).to eq(72)
expect(category.custom_fields).to eq("dancing" => "frogs") expect(category.custom_fields).to eq("dancing" => "frogs", "running" => ["turtle", "salamander"])
expect(category.minimum_required_tags).to eq(0) expect(category.minimum_required_tags).to eq(0)
expect(category.allow_global_tags).to eq(true) expect(category.allow_global_tags).to eq(true)
expect(category.category_required_tag_groups.count).to eq(1) expect(category.category_required_tag_groups.count).to eq(1)