lib/will_paginate/collection.rb in will_paginate-3.0.pre4 vs lib/will_paginate/collection.rb in will_paginate-3.0.0
- old
+ new
@@ -1,29 +1,9 @@
+require 'will_paginate/per_page'
+require 'will_paginate/page_number'
+
module WillPaginate
- # = Invalid page number error
- # This is an ArgumentError raised in case a page was requested that is either
- # zero or negative number. You should decide how do deal with such errors in
- # the controller.
- #
- # If you're using Rails 2, then this error will automatically get handled like
- # 404 Not Found. The hook is in "will_paginate.rb":
- #
- # ActionController::Base.rescue_responses['WillPaginate::InvalidPage'] = :not_found
- #
- # If you don't like this, use your preffered method of rescuing exceptions in
- # public from your controllers to handle this differently. The +rescue_from+
- # method is a nice addition to Rails 2.
- #
- # This error is *not* raised when a page further than the last page is
- # requested. Use <tt>WillPaginate::Collection#out_of_bounds?</tt> method to
- # check for those cases and manually deal with them as you see fit.
- class InvalidPage < ArgumentError
- def initialize(page, page_num) #:nodoc:
- super "#{page.inspect} given as value, which translates to '#{page_num}' as page number"
- end
- end
-
# = The key to pagination
# Arrays returned from paginating finds are, in fact, instances of this little
# class. You may think of WillPaginate::Collection as an ordinary array with
# some extra properties. Those properties are used by view helpers to generate
# correct page links.
@@ -31,29 +11,24 @@
# WillPaginate::Collection also assists in rolling out your own pagination
# solutions: see +create+.
#
# If you are writing a library that provides a collection which you would like
# to conform to this API, you don't have to copy these methods over; simply
- # make your plugin/gem dependant on the "will_paginate" gem:
+ # make your plugin/gem dependant on this library and do:
#
- # gem 'will_paginate'
# require 'will_paginate/collection'
- #
- # # now use WillPaginate::Collection directly or subclass it
+ # # WillPaginate::Collection is now available for use
class Collection < Array
attr_reader :current_page, :per_page, :total_entries, :total_pages
# Arguments to the constructor are the current page number, per-page limit
# and the total number of entries. The last argument is optional because it
# is best to do lazy counting; in other words, count *conditionally* after
# populating the collection using the +replace+ method.
- def initialize(page, per_page, total = nil)
- @current_page = page.to_i
- raise InvalidPage.new(page, @current_page) if @current_page < 1
+ def initialize(page, per_page = WillPaginate.per_page, total = nil)
+ @current_page = WillPaginate::PageNumber(page)
@per_page = per_page.to_i
- raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1
-
self.total_entries = total if total
end
# Just like +new+, but yields the object after instantiation and returns it
# afterwards. This is very useful for manual pagination:
@@ -80,11 +55,11 @@
# end
# end
#
# The Array#paginate API has since then changed, but this still serves as a
# fine example of WillPaginate::Collection usage.
- def self.create(page, per_page, total = nil, &block)
+ def self.create(page, per_page, total = nil)
pager = new(page, per_page, total)
yield pager
pager
end
@@ -96,13 +71,13 @@
end
# Current offset of the paginated collection. If we're on the first page,
# it is always 0. If we're on the 2nd page and there are 30 entries per page,
# the offset is 30. This property is useful if you want to render ordinals
- # besides your records: simply start with offset + 1.
+ # side by side with records in the view: simply start with offset + 1.
def offset
- (current_page - 1) * per_page
+ @current_page.to_offset(per_page).to_i
end
# current_page - 1 or nil if there is no previous page
def previous_page
current_page > 1 ? (current_page - 1) : nil
@@ -110,10 +85,11 @@
# current_page + 1 or nil if there is no next page
def next_page
current_page < total_pages ? (current_page + 1) : nil
end
-
+
+ # sets the <tt>total_entries</tt> property and calculates <tt>total_pages</tt>
def total_entries=(number)
@total_entries = number.to_i
@total_pages = (@total_entries / per_page.to_f).ceil
end