如果你不想分页,那么你必须做额外的查询,以确保到下一个/上一个记录的链接是准确的。下面示出实施例...
在你的图像模型:
class Image < ActiveRecord::Base
belongs_to :album
def previous
Image.where("album_id = ? AND id < ?", self.album.id, self.id).first
end
def next
Image.where("album_id = ? AND id > ?", self.album.id, self.id).first
end
end
然后在控制器中:
def show
@current_image = Image.find(params[:id])
@prev = @current_image.previous
@next = @current_image.next
respond_to do |format|
format.html
end
end
最后在视图中(这是HAML代码):
= link_to_unless(@prev.blank?, 'Prev', image_path(@prev))
= link_to_unless(@next.blank?, 'Next', image_path(@next))
请记住,previous
和next
可能会返回nil
如果没有找到上一张或下一张图片,则不应在该场景中显示上一个/下一个链接。
如果你最终使用will_paginate
或Kaminari
宝石(强烈推荐),您可以生成“漂亮”只需添加一个匹配的路由到您的routes.rb文件路径:
match '/albums/:id/page/:page' => "albums#show"
# put the matched route above the regular :albums resource
# so it matches that route first if it's given a page
resources :albums
的有效的原因是因为这两个分页宝石使用Rails url_for
方法来生成上一个/下一个链接,因此Rails将匹配该路线并生成类似于http://rtattoos.com/albums/2/page/26而不是http://rtattoos.com/albums/2?page=26
这是非常棒的,但它似乎并没有限制下一个/上一个图像在父容器中的内容。 然后我得到一个错误,因为respond_with线: 'RuntimeError(为了使用respond_with,首先你需要声明你的控制器在类级别响应的格式)' – rugbert 2012-01-12 02:45:19
这只是一个通用的例子:)我不知道你的模型或控制器设置,所以我只想告诉你一种方法。您将不得不稍微修改代码以适应您当前的设置。像'Image.where(“album_id =?AND id <?”,self.album.id,self.id).first等等。你不需要使用'respond_with',你可以使用普通的'respond_to'而不是格式块。再次,这只是一个例子 – iwasrobbed 2012-01-12 04:19:19
@rugbert顺便说一下,我更新了我的答案,并添加了一个示例,展示如何使用will_paginate gem轻松生成“漂亮”路线。 – iwasrobbed 2012-01-12 04:43:13