will_paginate ajax

两种方法
一,
@@pagination_options = { :class => 'pagination',
    :prev_label   => '上一页',
    :next_label   => '下一页',
    :inner_window => 4, # links around the current page
    :outer_window => 1, # links around beginning and end
    :separator    => ' ', # single space is friendly to spiders and non-graphic browsers
    :param_name   => :page,
    #add by chengang
    :update =>nil, #ajax所要更新的html元素的id
    :url_suffix => ''  #url的后缀,主要是为了补全REST所需要的url
    #add end
  }
  mattr_reader :pagination_options

  # => will_paginate Ajax效果扩展Helper方法
  def will_paginate_remote(entries = @entries, options = {})
    total_pages = entries.total_pages

    if total_pages > 1
      options = options.symbolize_keys.reverse_merge(pagination_options)
      page, param = entries.current_page, options.delete(:param_name)

      inner_window, outer_window = options.delete(:inner_window).to_i, options.delete(:outer_window).to_i
      #add by chengang
      update =  options.delete(:update)
      suffix =  options.delete(:url_suffix)
      url = request.env['PATH_INFO']
      url += suffix if suffix
      #add end

      min = page - inner_window
      max = page + inner_window
      if max > total_pages then min -= max - total_pages
      elsif min < 1  then max += 1 - min
      end

      current   = min..max
      beginning = 1..(1 + outer_window)
      tail      = (total_pages - outer_window)..total_pages
      visible   = [beginning, current, tail].map(&:to_a).flatten.sort.uniq
      links, prev = [], 0

      visible.each do |n|
        next if n < 1
        break if n > total_pages

        unless n - prev > 1
          prev = n
          #change by chengang
          text = (n==page ? n : "[#{n}]")
          links << page_link_remote_or_span((n != page ? n : nil), 'current', text, param, update, url)
        else
          prev = n - 1
          links << '...'
          redo
        end
      end

      #change by chengang
      links.unshift page_link_remote_or_span(entries.previous_page, 'disabled', options.delete(:prev_label), param, update, url)
      links.push    page_link_remote_or_span(entries.next_page,     'disabled', options.delete(:next_label), param, update, url)
      #change end

      content_tag :div, links.join(options.delete(:separator)), options
    end
  end

<%= will_paginate_remote @task_logs, :update => 'task_logs_list', :url_suffix => nil %>

二,
<%= will_paginate @task_logs, {
      :renderer => 'WillPaginate::LinkRenderer',
      :update => 'task_logs_list',
      :url => task_url(@task),
      :create => '',
      :complete => ''}%>

class AjaxLinkRenderer < WillPaginate::LinkRenderer
  def page_link_or_span(page, span_class = 'current', text = nil)
    text ||= page.to_s
    if page and page != current_page
      @template.link_to_remote text, :url=>url_options(page),:update=>@options[:update]
    else
      @template.content_tag :span, text, :class => span_class
    end
  end
end

你可能感兴趣的:(Ajax,Rails,paginate)