打印

[Rails 常用插件简介]will_paginate

本帖已经被作者加入个人空间

[Rails 常用插件简介]will_paginate

Rails2.0中原pagination将被移出作为插件classic_pagination,will_paginate是个非常不错的替代方案

一:安装

 ruby script/plugin install svn://errtheblog.com/svn/plugins/will_paginate  


二:使用

Controller

 @posts = Post.paginate_by_board_id @board.id, :page => params[:page]||1


如我们以前的find一样

在View中显示分页

<%= will_paginate @posts %>


那么如何设定每页显示记录条数?paginate将会调用mode的per_page,譬如上面的Post将会调用Post.per_page.或者直接在paginate中加上per_page
1:) 在model中

    class Post < ActiveRecord::Base
      cattr_reader :per_page
      @@per_page = 50
    end




    class Post < ActiveRecord::Base
      class<<self
          def per_page
            50
          end
      end
    end


2:) 在controller中

@posts = Post.paginate :page => params[:page]||1, :per_page => 50


如果没有设定,将会使用默认值30

will_paginate 对原有的find做了包装,并且新增几个特性,如下:

page           REQUIRED, but defaults to 1 if false or nil
per_page       (default is read from the model, which is 30 if not overriden)
total entries  not needed unless you want to count the records yourself somehow
count          hash of options that are used only for the call to count


注:page 属性是必须的
本帖最近评分记录
  • drive2me R币 +2 这些也是Ruby学习,多多益善。 2007-8-26 23:27

TOP

加入收藏了,要用时就取出来用!
Flying Piggy...! 
天地人合一!

TOP

即是现在不能直接用pagination了?
本帖最近评分记录
  • yangtao309 R币 -1 我很赞同 2007-12-18 16:09

TOP

目前可以的:)

TOP

@posts = Post.paginate_by_board_id @board.id, :page => params[:page]||1
这样有点不太对吧?报错

看railscast的视频,这样没错
@products = Product.paginate :per_page => 1, :page => params[:page]

I.forget('you'){|something| something.remember.deepen}

TOP

引用:
原帖由 blackanger 于 2007-9-5 17:28 发表
@posts = Post.paginate_by_board_id @board.id, :page => params[:page]||1
这样有点不太对吧?报错

看railscast的视频,这样没错
@products = Product.paginate :per_page => 1, :page => params[:page]
呵呵,我们来分析一下源码
在finder 87 行

 finder = method.to_s.sub /^paginate/, 'find'


那么代码

paginate_by_board_id


将被翻译成

find_by_board_id


继续看代码,从代码92起

if finder == 'find'
  args.unshift(:all) if args.empty?
elsif finder.index('find_by_') == 0
  finder.sub! /^find/, 'find_all'
end


简单解释一下,如果仅仅find,那么会添加:all参数,如果是以find_by,将会被替换为find_all*,也就是说在will_paginate 中 :all参数是一定的。

params[:page]||1 仅仅是在page没有值的情况下赋1,没有错的,其实这一步也是多余的,我们看一下142的代码

page = options.delete(:page) || 1


然后我们来看一下最后的代码

  ::Object.returning WillPaginate::Collection.new(page, per_page, total_entries) do |pager|
          args << options.update(:offset => pager.offset, :limit => pager.per_page)
          pager.replace send(finder, *args)
        end


Done。

[ 本帖最后由 martin 于 2007-9-5 18:59 编辑 ]
本帖最近评分记录
  • drive2me R币 +3 说明很仔细! 2007-9-5 19:41

TOP

说明一下retuning,在rails的core-ext object中

def returning(value)
  yield(value)
  value
end


很简单,但是我们的代码可以写的更漂亮一点:)

举个例子

forum = Forum.new
forum.title=“Martin's Thought”
forum.author = 'martin'
...


现在代码就可以写成这个样子

returning Forum.new do |forum|
   forum.title= ”Martin\'s Thought“
   forum.author = 'martin'
end


Is it?
本帖最近评分记录
  • drive2me R币 +2 有帮助! 2007-9-5 19:42

TOP

@products = Product.paginate_by_board_id @board.id,:page => params[:page]||1
我这样就会出错了
RuntimeError in AdminController#list

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

rails报的错也挺有意思阿,人性化
RuntimeError in AdminController#list

I can't make sense of find_by_board_id

[ 本帖最后由 blackanger 于 2007-9-5 19:31 编辑 ]
本帖最近评分记录
  • drive2me R币 +3 深入研究! 2007-9-5 19:42

I.forget('you'){|something| something.remember.deepen}

TOP

引用:
Called id for nil
上面的错误写的很明显,是因为@board为空,所以@board.id抛出这样的错误。跟paginate_by_** 无关。

我上面回那篇帖子并不是为了证明谁对谁错,只是想抛砖引玉,带动大家讨论的积极性。一直以来RC上没有太多人讨论ruby/rails上的东西,大家很少参与讨论,我希望能有所改进,从每一个人做起.

@products = Product.paginate :per_page => 1, :page => params[:page]


当然正确,如果你带参数了也可以写成

@products = Product.paginate_by_some_columns values,[....], :per_page => 1, :page => params[:page]


这个和我们通常写的find find_by_username_and_password 一样:)

你说呢?

TOP

明白你的意思了,我也不是和你探讨谁对谁错。。。有点不明白那个board,现在明白了
本帖最近评分记录
  • martin R币 +2 :) 2007-9-5 21:03

I.forget('you'){|something| something.remember.deepen}

TOP

呵呵,应该是我说抱歉:) 写代码的时候写的太随意了,想到论坛版块Board,就写了这个例子。

TOP

引用:
原帖由 martin 于 2007-9-5 20:42 发表

上面的错误写的很明显,是因为@board为空,所以@board.id抛出这样的错误。跟paginate_by_** 无关。

我上面回那篇帖子并不是为了证明谁对谁错,只是想抛砖引玉,带动大家讨论的积极性。一直以来RC上没有太多 ...
谢谢费心,我们在加油呢,大家都还比较新,需要点时间来加入进来。

我们需要你们这些高手的指引,很感谢,其实我们一直跟踪呢,就是还插不上话。也请对我们耐心一些,呵呵!
我们很喜欢你的耐心和细心,说明总是很详细和清楚。名副其实的好技术者和指导者!

[ 本帖最后由 drive2me 于 2007-9-5 21:06 编辑 ]
Flying Piggy...! 
天地人合一!

TOP

但是我换了@product还是错误。。。-_-!
有没有让will_paginate支持ajax分页的方法呢?介绍一下

I.forget('you'){|something| something.remember.deepen}

TOP

引用:
原帖由 blackanger 于 2007-9-6 00:16 发表
但是我换了@product还是错误。。。-_-!
报什么错误?
引用:
有没有让will_paginate支持ajax分页的方法呢?介绍一下
这个很是好弄的,你只需要将原来的link换成link_to_remote,指定update就可以了。

刚才俺在google中搜索了一下,看到这个帖子:http://www.blogjava.net/chengang/archive/2007/09/02/142077.html 他的帖子中引用了我的帖子,证明俺不是**,哈哈:) 不过俺不喜欢他的那篇文字,让人没有读下去的欲望
一:到处都是 add by **,change by**
二:只需要把自己做修改的部分加重说明即可,本身就一个简单的修改,何必弄的看起来这么复杂,满眼看去没有任何重点。
三:整个排版感觉严重不好

推荐两篇文字:
http://wiki.rubyonrails.com/rails/pages/How+to+Paginate+With+Ajax 
http://dev.nozav.org/rails_ajax_table.html

如果你需要修改will_paginate,直接修改 vendor\plugins\will_paginate\lib\will_paginate\view_helpers.rb即可

[ 本帖最后由 martin 于 2007-9-6 07:18 编辑 ]

TOP

刚才没注意,貌似 blackanger 深夜发的帖子:) huhu,好家伙,夜猫子

TOP

2008-12-03 01:11 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61