diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 32811a98f..6639253bb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -248,7 +248,7 @@ class ApplicationController < ActionController::Base # => /tags?search[name]=touhou def normalize_search return unless request.get? || request.head? - params[:search] ||= ActionController::Parameters.new + params[:search] = ActionController::Parameters.new unless params[:search].is_a?(ActionController::Parameters) deep_reject_blank = lambda do |hash| hash.reject { |_k, v| v.blank? || (v.is_a?(Hash) && deep_reject_blank.call(v).blank?) } diff --git a/test/functional/application_controller_test.rb b/test/functional/application_controller_test.rb index d8eb31429..edbb71528 100644 --- a/test/functional/application_controller_test.rb +++ b/test/functional/application_controller_test.rb @@ -342,6 +342,20 @@ class ApplicationControllerTest < ActionDispatch::IntegrationTest assert_equal([tags[0].id], response.parsed_body.pluck("id")) end + should "remove blank `search` params from the URL" do + get tags_path(search: { name: "touhou", blah: "" }), as: :json + + assert_redirected_to tags_path(search: { name: "touhou" }) + end + + should "ignore invalid `search` params" do + get tags_path(search: "foo"), as: :json + assert_response :success + + get tags_path("search[]": "foo"), as: :json + assert_response :success + end + should "support the expiry parameter" do get posts_path, as: :json, params: { expiry: "1" }