From 61ffb68400aa432f27d1dbd3c47bb1f112f5eed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Mon, 29 May 2023 22:24:09 +0200 Subject: [PATCH] Preserve query parameters in pagination links from POST request --- lib/will_paginate/view_helpers/action_view.rb | 8 ++++++-- spec/view_helpers/action_view_spec.rb | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/will_paginate/view_helpers/action_view.rb b/lib/will_paginate/view_helpers/action_view.rb index b583a9af2..e12f83779 100644 --- a/lib/will_paginate/view_helpers/action_view.rb +++ b/lib/will_paginate/view_helpers/action_view.rb @@ -119,8 +119,12 @@ def url(page) end def merge_get_params(url_params) - if @template.respond_to? :request and @template.request and @template.request.get? - symbolized_update(url_params, @template.params, GET_PARAMS_BLACKLIST) + if @template.respond_to?(:request) and @template.request + if @template.request.get? + symbolized_update(url_params, @template.params, GET_PARAMS_BLACKLIST) + elsif @template.request.respond_to?(:query_parameters) + symbolized_update(url_params, @template.request.query_parameters, GET_PARAMS_BLACKLIST) + end end url_params end diff --git a/spec/view_helpers/action_view_spec.rb b/spec/view_helpers/action_view_spec.rb index ccebc2728..fd8445166 100644 --- a/spec/view_helpers/action_view_spec.rb +++ b/spec/view_helpers/action_view_spec.rb @@ -220,11 +220,13 @@ def renderer.gap() '~~' end assert_no_links_match /p0wned/ end - it "should not preserve parameters on POST" do + it "should only preserve query parameters on POST" do request.post request.params :foo => 'bar' + request.query_parameters = { :hello => 'world' } paginate assert_no_links_match /foo=bar/ + assert_links_match /hello=world/ end it "should add additional parameters to links" do @@ -465,6 +467,18 @@ def params(more = nil) @params.update(more) if more ActionController::Parameters.new(@params) end + + def query_parameters + if get? + params + else + ActionController::Parameters.new(@query_parameters) + end + end + + def query_parameters=(more) + @query_parameters = more.with_indifferent_access + end def host_with_port 'example.com'