To follow up on my other blog post about Paginating an ActiveResource model and to_xml I figured I should include the client-side code so you can see how to actually use will paginate helpers out of the box to paginate an ActiveResource request.
We are currently working on a project that involves Flex and active resource + will_paginate and we needed to be able to paginate the xml transactions easily. Unfortunately, will_paginate and to_xml don’t play nicely when it comes to adding the current_page, total_pages, and page attributes to the xml. After many failed attempts I went looking around and found in a few of that some people had solved this problem but, I didn’t want to install another version of the gem to risk breaking other apps on the server so I did it the rails way!
I started by creating a module that opens up the will_paginate class and includes ActiveResource and alias method chain the to_xml method to include these values. Example code below.
#enviroment.rb
...
require'to_xml_extensions'
#lib/to_xml_extensions.rbmodule WillPaginateHelpers
includeActiveSupport::CoreExtensions::Array::Conversions
def to_xml_with_collection_type(options = {})
serializeable_collection.to_xml_without_collection_type(options)do|xml|
xml.tag!(:current_page, {:type =>ActiveSupport::CoreExtensions::Hash::Conversions::XML_TYPE_NAMES[current_page.class.name]}, current_page)
xml.tag!(:per_page, {:type =>ActiveSupport::CoreExtensions::Hash::Conversions::XML_TYPE_NAMES[per_page.class.name]}, per_page)
xml.tag!(:total_entries, {:type =>ActiveSupport::CoreExtensions::Hash::Conversions::XML_TYPE_NAMES[total_entries.class.name]}, total_entries)end.sub(%{type="array"}, %{type="collection"})end
alias_method_chain :to_xml, :collection_typedef serializeable_collection #:nodoc:# Ugly hack because to_xml will not yield the XML Builder object when empty?
empty? ? returning(self.clone){|c| c.instance_eval{|i|def empty?; false; end}} : selfendendWillPaginate::Collection.send(:include, WillPaginateHelpers)
This now gives me the proper xml when I call to_xml