`
xxj
  • 浏览: 430488 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[Rails 常用插件简介]ajax_paginate

阅读更多
这个并不是一个完整的插件,仅供娱乐:)

其实这也是个简单的插件制作过程,本插件依赖will_paginate

一:新建Project
rails ajax_paginate_demo


地球人都知道这个是干嘛的,不说了

二:安装will_paginate插件
http://mmm.iteye.com/blog/116931


三:制作我们的ajax_paginate插件
ruby script/generate plugin ajax_paginate


并且在lib下新建ajax_paginate目录,目录如下图


修改init.rb

require 'ajax_paginate/view_helpers'

ActionView::Base.send :include, AjaxPaginate::ViewHelpers


如果你看过插件的源码,那么这个就不用说了。(就是让View中可以直接使用我们的AjaxPaginate::ViewHelpers中的方法)

will_paginate默认已经实现了分页的功能,我们要做的仅仅是增加ajax显示的效果,AjaxPaginate::ViewHelpers 从WillPaginate::ViewHelpers copy 过来的,
首先修改原来的will_paginate,我们从新命名为ajax_paginate

稍作修改
 def ajax_paginate(entries = @entries, options = {})
            total_pages = entries.page_count

            if total_pages > 1
               #保持原有的WillPaginate的options参数
                options = WillPaginate::ViewHelpers.pagination_options.merge options.symbolize_keys
                #....                      
                #修改为remote_page_link_or_span,下同                       
                        links << remote_page_link_or_span((n != page ? n : nil), 'current', n, param)
                    
                #...............
                # next and previous buttons
                links.unshift remote_page_link_or_span(entries.previous_page, 'disabled', options.delete(:prev_label), param)
                links.push    remote_page_link_or_span(entries.next_page,     'disabled', options.delete(:next_label), param)               
                #...............
            end
        end



增加remote_page_link_or_span

        def remote_page_link_or_span(page, span_class, text, param)
            unless page
                content_tag :span, text, :class => span_class
            else
                # page links should preserve GET parameters, so we merge params
                link_to_remote text, :url=>params.merge(param.to_sym => (page !=1 ? page : nil)), :method=>:get, :update=>''
            end
        end



update为什么写死在这里,因为我偷懒,你可以跟WillPaginate::ViewHelpers一样做成options,这个最后再讨论


OK,可以使用了:)
在View中直接使用
<%=ajax_paginate @users%>


即可看到效果了.

================================== 华丽的分割线=================================================
来个简单的应用来演示我们的插件是否生效,刚才我们已经新建了ajax_paginate_demo项目
1:修改database.yml
development:
  adapter: mysql
  database: ajax_paginate_demo
  username: root
  password: 
  host: localhost


2:建立数据库
create database ajax_paginate_demo


3:创建例子中的model,我们选用User
ruby script\generate scaffold_resource user name:string


仅仅包括一个字段,将附件中的001_create_users.rb覆盖你的数据,执行
rake db:migrate


将会导入千八条的数据(这些数据来源于互联网,我随手检索了Authors List 发现这个网页的,我只是整理了下,做测试数据:http://www.classicreader.com/allauthor.htm

4:修改users_controller.rb
class UsersController < ApplicationController
    # GET /users
    # GET /users.xml
    def index
        @users = User.paginate :all, :page=>params[:page]||1
        respond_to do |format|
            format.html do
                unless params[:page].nil?
                    render :update do |page|
                        page.replace_html :page, :partial=>'list'
                    end
                end
            end
            format.xml  do
                render :xml => @users.to_xml
            end
        end
    end
end


注意:
我们这里指定了更新的div id为 page,你可以将这个参数一并加到我们的更一步考虑中

5:修改index.html
<h1>Listing users</h1>
<div id="spinner_div" style="float:right">
    <%= image_tag 'spinner.gif', :id => 'spinner', :style => 'display: none' %>
</div>
<div id="page">
    <%=render :partial=>'list'%>
</div>


新增_list.rhtml
<table>
  <tr>
    <th>Name</th>
  </tr>

<% for user in @users %>
  <tr>
    <td><%=h user.name %></td>
  </tr>
<% end %>
</table>
<%=ajax_paginate @users%>


6:Ajax需要导入js,修改/app/views/layouts/users.rhtml导入js
  <%= javascript_include_tag :defaults%>


7:增加点ajax的经典效果
修改remote_page_link_or_span 使之一直有效 (俺偷懒,这个一并和上面的update加入更进一步考虑中实现之)
link_to_remote text, :url=>params.merge(param.to_sym => (page !=1 ? page : nil)), :method=>:get, :update=>'', :before => %(Element.show('spinner')), :success => %(Element.hide('spinner'))


8:
还有什么呢?
........

没了,真的没了,测试一下看看结果如何:)满意不? 


任务还没完成,同志尚需努力!
================================== 华丽的分割线=================================================
更进一步讨论:
1:增加更多的可选参数,让他真正同link_to_remote一样,我们看下rails源码中的AJAX_OPTIONS
CALLBACKS = Set.new([ :uninitialized, :loading, :loaded, :interactive, :complete, :failure, :success ] + (100..599).to_a) 
AJAX_OPTIONS = Set.new([ :before, :after, :condition, :url, :asynchronous, :method, :insertion, :position, :form, :with, :update, :script ]).merge(CALLBACKS) 



代码见这里
http://ajaxpaginate.googlecode.com/svn/trunk/ajax_paginate/

演示代码见这里:
http://ajaxpaginate.googlecode.com/svn/trunk/ajax_paginate_demo/

你可以使用svn checkout。
分享到:
评论

相关推荐

    will_paginate分页插件

    Rails框架中,`will_paginate`是一个非常流行且强大的分页插件,它简洁易用,功能强大,能够很好地与ActiveRecord集成。本文将深入探讨`will_paginate`的使用方法、核心概念以及其实现原理。 ### 一、安装与配置 ...

    will_paginate 2.2.2

    `will_paginate`是Rails框架中非常流行的一个分页插件,版本2.2.2是它的一个历史版本。在本文中,我们将深入探讨`will_paginate`的使用方法、功能特性以及它如何与Rails集成,帮助提升Web应用的性能和用户体验。 一...

    will_paginate-bootstrap, 将 Twitter Bootstrap 分页组件与will_paginate集成.zip

    will_paginate-bootstrap, 将 Twitter Bootstrap 分页组件与will_paginate集成 will_paginate-bootstrap不再维护我不再使用 Bootstrap 来使用 Rails,所以不幸的是,我不再接受请求请求或者维护这个库。 为了发布你...

    will_paginate插件下载

    will_paginate是一款广受欢迎的Ruby on Rails插件,用于实现高效、简洁的数据分页。在本文中,我们将深入探讨will_paginate的安装、使用方法以及其核心概念,帮助开发者更好地理解和应用这个插件。 一、will_...

    scaffolding+will_paginate+提供will_paginate下载

    在Rails项目中,安装`will_paginate`非常简单,只需要在Gemfile中添加gem `'will_paginate'`,然后执行`bundle install`即可。 `will_paginate`的使用通常包括以下几个步骤: 1. **引入Gem**:首先,在Gemfile中...

    will_paginate v2.3.11

    《will_paginate v2.3.11:Rails分页插件详解》 在Web开发中,处理大量的数据是常见的需求,特别是在使用Ruby on Rails框架时。为了优化用户体验,提高页面加载速度,分页功能显得尤为重要。这时,will_paginate...

    will_paginate 2.1.0

    `will_paginate` 是一个非常流行的 Ruby on Rails(Rails)框架中的分页库,它为开发者提供了方便的方式来处理大量数据的分页展示。版本 `2.1.0` 是这个库的一个特定版本,包含了该库在当时的一些特性、优化和可能的...

    ruby on rails 常用插件下载

    在这个特定的场景中,我们关注的是一个名为 "will_paginate" 的插件,它是 Ruby on Rails 中用于实现高效、灵活分页功能的常用工具。 `will_paginate` 插件为 Rails 应用程序提供了一种简单而优雅的方式来处理大量...

    [Rails 常用插件简介]CRUD Generator 2

    **Rails 常用插件简介 - CRUD Generator 2** 在Ruby on Rails框架中,开发过程中经常需要创建、读取、更新和删除(CRUD)数据。为了提高开发效率,开发者通常会使用各种插件来自动化这个过程。CRUD Generator 2就是...

    rails 2.0.2 分页 需另外下载插件

    在Rails 2.0.2中,你需要通过Gemfile来添加will_paginate插件。首先,在你的项目目录下的Gemfile中添加以下代码: ```ruby gem 'will_paginate', '~&gt; 2.3.16' # 使用适合Rails 2.0.2的版本号 ``` 然后运行`bundle ...

    用于过滤英文脏话的 Rails 插件 gem_Ruby_代码_相关文件_下载

    标题提到的"用于过滤英文脏话的 Rails 插件 gem"正是为了解决这个问题。这个插件允许开发者通过简单的配置,对输入的文本进行检查和替换,确保网站内容的清洁度和专业性。 这个插件名为`profanity_filter`,它是一...

    will_paginate:用于Rails,Sinatra,Merb,DataMapper等的分页库

    will_paginate will_paginate是一个分页库,与Ruby on Rails,Sinatra,Hanami :: View,Merb,DataMapper和Sequel集成。 安装: ## Gemfile for Rails 3+, Sinatra, and Merbgem 'will_paginate' , '~&gt; 3.1.0' 有关...

    will_paginate_endless_scroll_example:如何使用 will_paginate gem 创建无限滚动的演示

    使用gem 'will_paginate', '~&gt; 3.0.7'实现无限/无限滚动的工作 Rails CRUD 应用程序示例。 gem 'faker'被用来为项目gem 'faker'虚假数据。 演示 现场演示: : 在本地开发中安装 克隆回购: git clone git@github...

    WillPaginateExample:Ruby on Rails的Will_Paginate示例

    `Will_Paginate` 是一个非常流行的Ruby on Rails插件,用于处理大型数据集的分页。它提供了简洁、灵活的API,使得在Rails应用中实现数据库查询结果的分页变得简单易行。在本篇文章中,我们将深入探讨`Will_Paginate`...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    Rails_3_Cheat_Sheets.pdf

    Rails_3_Cheat_Sheets.pdf

    RestFul_Rails_Dev_pdf_v_0.1.zip

    本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...

    rails_admin_become_user:以设计用户身份登录的 Rails Admin 插件

    Rails 管理员成为用户 ... rails_admin_become_user必须在rails_admin之后rails_admin才能正常工作。 在您的config/initializers/rails_admin.rb初始化程序中添加配置: RailsAdmin . config do | config |

Global site tag (gtag.js) - Google Analytics