2012-01-11 33 views
4

所以我有一个图像(纹身)共享网站与3种不同的索引图像的方式。仅显示Image.all的主页面,显示@ member.images.all的成员图像以及成员的相册图像。也就是说,一个会员有许多图像(和专辑),而专辑有很多图像。如何链接到属于Rails 3中的对象的下一条或上一条记录?

现在,当您点击图片时,无论它是哪里(索引,会员的个人资料或会员的相册),您都可以进入展示页面。我想我可能需要一个上一个和下一个链接来显示下一个图像,但我需要能够限制图像到他们的父容器。

因此,如果我在相册内查看图像,我需要下一个和上一个链接才能链接到该相册中的图像。如果我在会员的图像中查看不在某个专辑中,则链接将指向该会员拥有的图像,而不是专辑。

如果图像位于首页,则链接将指向所有图像。

回答

5

如果你不想分页,那么你必须做额外的查询,以确保到下一个/上一个记录的链接是准确的。下面示出实施例...

在你的图像模型:

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)) 

请记住,previousnext可能会返回nil如果没有找到上一张或下一张图片,则不应在该场景中显示上一个/下一个链接。


如果你最终使用will_paginateKaminari宝石(强烈推荐),您可以生成“漂亮”只需添加一个匹配的路由到您的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

+0

这是非常棒的,但它似乎并没有限制下一个/上一个图像在父容器中的内容。 然后我得到一个错误,因为respond_with线: 'RuntimeError(为了使用respond_with,首先你需要声明你的控制器在类级别响应的格式)' – rugbert 2012-01-12 02:45:19

+0

这只是一个通用的例子:)我不知道你的模型或控制器设置,所以我只想告诉你一种方法。您将不得不稍微修改代码以适应您当前的设置。像'Image.where(“album_id =?AND id <?”,self.album.id,self.id).first等等。你不需要使用'respond_with',你可以使用普通的'respond_to'而不是格式块。再次,这只是一个例子 – iwasrobbed 2012-01-12 04:19:19

+0

@rugbert顺便说一下,我更新了我的答案,并添加了一个示例,展示如何使用will_paginate gem轻松生成“漂亮”路线。 – iwasrobbed 2012-01-12 04:43:13

3

这是一个典型的分页类型问题。记录的每个显示总是带有某种条件(即使它是find(:all))。请看will_paginate以便轻松创建视图和集合对象。唯一的附加工作是始终提供页面更改的条件以重新发布下一组模型请求。

+0

我不认为我想分页,因为我试图让链接和共享干净的网址。 – rugbert 2012-01-11 19:59:28

+1

我发布了一个例子,展示了如何在没有分页的情况下做到这一点,但我同意尼克在这个分页方面最好的方法。我不认为我真的明白这是如何使你的网址变脏,因为你可以格式化,但是你希望 – iwasrobbed 2012-01-11 20:39:48

+0

我的意思是,当我过去使用了will_paginate时,点击next会在网址中添加类似?page = 2的内容,而我想让我的网站成为图片视图的直接链接 – rugbert 2012-01-11 22:13:11

0

如果在显示页面中有@photo = Photo.find(params[:id])您可以尝试将当前照片的ID传递给nextPhoto或previousPhoto方法。 nextPhoto方法将有@photo = Photo.find(id + 1)和previousPhoto有@photo = Photo.find(id -1)。我不确定这个语法是否有效,但是这些内容似乎就是你正在寻找的东西。

相关问题