diff --git a/lib/geared_pagination/portions/portion_at_offset.rb b/lib/geared_pagination/portions/portion_at_offset.rb index 338c55d..c5c5e99 100644 --- a/lib/geared_pagination/portions/portion_at_offset.rb +++ b/lib/geared_pagination/portions/portion_at_offset.rb @@ -17,7 +17,10 @@ def limit end def offset - (page_number - 1).times.sum { |index| ratios[index + 1] } + variable = [(page_number - 1), ratios.size - 1].min.times.sum { |index| ratios[index + 1] } + fixed = [page_number - ratios.size, 0].max * ratios.fixed + + variable + fixed end def next_param(*) diff --git a/lib/geared_pagination/ratios.rb b/lib/geared_pagination/ratios.rb index 615b95f..5e48782 100644 --- a/lib/geared_pagination/ratios.rb +++ b/lib/geared_pagination/ratios.rb @@ -3,15 +3,23 @@ class Ratios DEFAULTS = [ 15, 30, 50, 100 ] def initialize(ratios = nil) - @ratios = Array(ratios || DEFAULTS) + @ratios = Array(ratios || DEFAULTS).map(&:to_i) end def [](page_number) - @ratios[page_number - 1] || @ratios.last + @ratios[page_number - 1] || fixed end def cache_key @ratios.join('-') end + + def size + @ratios.size + end + + def fixed + @ratios.last + end end end diff --git a/test/controller_test.rb b/test/controller_test.rb index 6280904..debdfc1 100644 --- a/test/controller_test.rb +++ b/test/controller_test.rb @@ -14,6 +14,9 @@ class GearedPagination::ControllerTest < ActionController::TestCase assert_equal etag_for("placeholder", "page/1:1-2"), response.etag etag_before_gearing_change = response.etag + get :index, params: { page: 2, per_page: [ 1, 2 ] } + assert_equal etag_for("placeholder", "page/2:1-2"), response.etag + get :index, params: { page: 1, per_page: [ 1, 2 ] } assert_equal etag_before_gearing_change, response.etag diff --git a/test/portion_at_offset_test.rb b/test/portion_at_offset_test.rb index ae3f210..01134e6 100644 --- a/test/portion_at_offset_test.rb +++ b/test/portion_at_offset_test.rb @@ -7,6 +7,9 @@ class GearedPagination::PortionAtOffsetTest < ActiveSupport::TestCase assert_equal 0, GearedPagination::PortionAtOffset.new(page_number: 1).offset assert_equal GearedPagination::Ratios::DEFAULTS.first, GearedPagination::PortionAtOffset.new(page_number: 2).offset assert_equal GearedPagination::Ratios::DEFAULTS.first + GearedPagination::Ratios::DEFAULTS.second, GearedPagination::PortionAtOffset.new(page_number: 3).offset + assert_equal 4.times.sum { |index| GearedPagination::Ratios::DEFAULTS[index] || GearedPagination::Ratios::DEFAULTS.last }, GearedPagination::PortionAtOffset.new(page_number: 5).offset + assert_equal 5.times.sum { |index| GearedPagination::Ratios::DEFAULTS[index] || GearedPagination::Ratios::DEFAULTS.last }, GearedPagination::PortionAtOffset.new(page_number: 6).offset + assert_equal 9.times.sum { |index| GearedPagination::Ratios::DEFAULTS[index] || GearedPagination::Ratios::DEFAULTS.last }, GearedPagination::PortionAtOffset.new(page_number: 10).offset end test "limit" do