ruby-on-railswill-paginate

custom will_paginate renderer


Documentation is lacking for will_paginate custom renderers:

There is no documentation how to write your own link renderer, but the source code is pretty self-explanatory. Dive into it, and selectively override methods of the LinkRenderer to adjust them to your needs.

Is there any unofficial documentation?


Solution

  • Found a decent blog post about custom will_paginate renderer

    module ApplicationHelper
      # change the default link renderer for will_paginate
      def will_paginate(collection_or_options = nil, options = {})
        if collection_or_options.is_a? Hash
          options, collection_or_options = collection_or_options, nil
        end
        unless options[:renderer]
          options = options.merge :renderer => MyCustomLinkRenderer
        end
        super *[collection_or_options, options].compact
      end
    end
    

    and then in an initializer

    class MyCustomLinkRenderer < WillPaginate::ActionView::LinkRenderer do
      def container_attributes
        {class: "tc cf mv2"}
      end
    
      def page_number(page)
        if page == current_page
          tag(:span, page, class: 'b bg-dark-blue near-white ba b--near-black pa2')
        else
          link(page, page, class: 'link ba b--near-black near-black pa2', rel: rel_value(page))
        end
      end
    
      def gap
        text = @template.will_paginate_translate(:page_gap) { '&hellip;' }
        %(<span class="mr2">#{text}</span>)
      end
    
      def previous_page
        num = @collection.current_page > 1 && @collection.current_page - 1
        previous_or_next_page(num, @options[:previous_label], 'link ba near-black b--near-black pa2')
      end
    
      def next_page
        num = @collection.current_page < total_pages && @collection.current_page + 1
        previous_or_next_page(num, @options[:next_label], 'link ba near-black b--near-black pa2')
      end
    
      def previous_or_next_page(page, text, classname)
        if page
          link(text, page, :class => classname)
        else
          tag(:span, text, :class => classname + ' bg-dark-blue near-white')
        end
      end
    end