我目前正在开发一个在Rails 2中编写的Reddit克隆应用程序,我正在尝试通过Rails 3中的新功能使其跟上速度。该应用程序非常简单,它有一个链接脚手架,其中包含:url
,:description
,:points
和:created_at
。该应用程序路由到links#submissions
,您可以在其中查看所有提交的链接并提交新链接。
在提交页面上显示链接时,我在 Rails 2 中的 paginate
方法遇到了问题。我目前正在运行 Rails 3.2.3,我知道我需要使用 Rails 3 中的 gem will_paginate
(我已包含在我的 Gemfile
中),但是每当我尝试拉起localhost:3000
时,我都会收到以下错误消息:
NoMethodError in LinksController#submissions...
undefined method paginate for #<LinksController:0x00000102ff5f98>
特别是在链接控制器的第 90 行。
这是我在我的LinksController.rb(第90-93行)中的内容。
@link_pages, @Links = paginate :links, :order => order, :per_page => 20
@header_text = case ordering
when 'hot' then 'Top rated submissions'
when 'new' then 'Latest submissions'
这不是在 Rails 3 中使用分页的正确方法吗?
对于will_paginate
,您应该在控制器中使用类似的东西:
@links = Link.paginate(:page => params[:page], :per_page => 20)
在您看来,给定页面的链接将存储在@links
实例变量中。 您可以循环访问该集合并显示链接。
要显示指向其他页面(链接的链接)的链接,请在视图中的某个位置使用它:
will_paginate @links
您可以在此处找到有关will_paginate
的更多帮助:https://github.com/mislav/will_paginate
但是,对于Rails 3,我更喜欢kaminari
而不是will_paginate
。 它使用 Rails 3 作用域。
在控制器中如下所示:
@links = Link.page(params[:page]).per(20)
这在观点中:
paginate @links
您可以在此处阅读有关kaminari
的更多信息:https://github.com/amatsuda/kaminari
你也可以在这里观看Ryan's Railscast kaminari
:http://railscasts.com/episodes/254-pagination-with-kaminari
您需要在模型上调用分页,因此
Link.paginate :page => params[:page], :per_page => 20
或
Link.[arel query].paginate :page => params[:page], :per_page => 20
应该工作。
要按创建的降序示例排序,您需要执行以下操作:
Link.order("created_at DESC").paginate :page => params[:page], :per_page => 20