所以我有一个图像(纹身)共享站点,其中包含 3 种不同的图像索引方式。只显示 Image.all 的主页,显示@member.images.all 的成员(member)图片,以及成员(member)的相册图片。也就是说,一个成员(member)有很多图片(和相册),一个相册有很多图片。
现在,当您单击图像时,无论它在哪里(索引、成员(member)个人资料或成员(member)相册),您都会进入显示页面。我想我可能需要一个上一个和下一个链接来显示下一个图像,但我需要能够将图像限制在它们的父容器中。
因此,如果我查看相册中的图像,我将需要下一个和上一个链接来仅链接到该相册中的图像。如果我查看的是不在相册中的成员图片,则链接将指向该成员(member)拥有的图片,而不是在相册中。
如果图像在首页,那么链接将只指向所有图像。
最佳答案
如果您不想分页,则必须进行额外的查询以确保指向下一个/上一个记录的链接准确无误。示例如下...
在您的图像模型中:
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
然后在您的 Controller 中:
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
gem(强烈推荐),你可以通过在你的 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
有效的原因是因为两个分页 gem 都使用 Rails
url_for
方法来生成上一个/下一个链接,因此 Rails 将匹配该路由并生成类似 http://rtattoos.com/albums/2/page/26 的内容。而不是 http://rtattoos.com/albums/2?page=26
关于ruby-on-rails - 如何链接到属于 Rails 3 中对象的下一条或上一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8825487/