rug*_*ert 4 ruby-on-rails ruby-on-rails-3
所以我有一个图像(纹身)共享网站有3种不同的索引图像方式.显示Image.all的主页面,显示@ member.images.all的成员图像,以及成员的专辑图像.也就是说,一个会员有很多图像(和专辑),一个专辑有很多图像.
现在,当您点击图片时,无论其位于何处(索引,会员的个人资料或会员专辑),您都可以进入展示页面.我想我可能需要一个上一个和下一个链接来显示下一个图像,但我需要能够将图像限制到它们的父容器.
因此,如果我正在查看相册中的图像,我需要下一个和上一个链接才能链接到该相册中的图像.如果我正在查看会员的图像而不是在相册中,那么链接将指向会员所拥有的图像,而不是相册中的图像.
如果图像位于首页,则链接将指向所有图像.
如果您不想分页,则必须执行其他查询以确保指向下一个/上一个记录的链接是准确的.示例如下......
在您的图像模型中:
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
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中:
def show
@current_image = Image.find(params[:id])
@prev = @current_image.previous
@next = @current_image.next
respond_to do |format|
format.html
end
end
Run Code Online (Sandbox Code Playgroud)
最后在您的视图中(这是HAML代码):
= link_to_unless(@prev.blank?, 'Prev', image_path(@prev))
= link_to_unless(@next.blank?, 'Next', image_path(@next))
Run Code Online (Sandbox Code Playgroud)
只要记住,previous而且next可以返回nil,如果没有前面或后面的图像被发现,所以你不应该显示该方案中的上/下一个环节.
如果您最终使用will_paginateor Kaminarigem(强烈推荐),只需在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
Run Code Online (Sandbox Code Playgroud)
有效的原因是因为两个分页宝石都使用Rails url_for方法生成上一个/下一个链接,因此Rails将匹配该路由并生成类似http://rtattoos.com/albums/2/page/26而不是http:/ /rtattoos.com/albums/2?page=26