And*_*rew 10 activerecord views ruby-on-rails ruby-on-rails-3
我的应用有照片,用户可以搜索符合特定条件的照片.假设用户按标签搜索照片,我们得到如下内容:
@results = Photo.tagged_with('mountain')
Run Code Online (Sandbox Code Playgroud)
现在,@results将成为具有多个记录的标准activerecord查询.这些将以网格显示,然后用户可以点击照片.这将使用户photos#show采取行动.
因此,假设用户搜索某些内容,并且该应用找到5条记录[1,2,3,4,5],并且用户点击了第3张照片.
在photo#show页面上,我希望能够显示"下一张照片","上一张照片"和"返回搜索".
唯一的另一个限制是,如果用户直接浏览照片(通过另一个页面或书签等),则不会有逻辑"下一个"和"上一个"照片,因为没有一个查询导致他们照片,因此在这种情况下,模板根本不应呈现与查询相关的内容.
所以,我一直在考虑如何做这种事情,我真的没有很多好主意.我想我可以做一些事情,比如在会话中存储查询以便能够回到它,但我不知道如何找到所选照片左右两侧显示的照片.
有没有人有任何关于如何做这种事情的例子?
And*_*rew 12
因此,经过多次试验和错误,我想出了以下内容:
在我的照片模型中:
# NEXT / PREVIOUS FUNCTIONALITY
def previous(query)
unless query.nil?
index = query.find_index(self.id)
prev_id = query[index-1] unless index.zero?
self.class.find_by_id(prev_id)
end
end
def next(query)
unless query.nil?
index = query.find_index(self.id)
next_id = query[index+1] unless index == query.size
self.class.find_by_id(next_id)
end
end
Run Code Online (Sandbox Code Playgroud)
此方法通过接受这些记录ID的数组,从搜索或特定文件夹视图返回下一个和上一个记录.我在任何创建查询视图的控制器视图中生成该ID(即搜索页面和按文件夹浏览页面):
因此,例如,我的搜索控制器包含:
def search
@search = @collection.photos.search(params[:search])
@photos = @search.page(params[:page]).per(20)
session[:query] = @photos.map(&:id)
end
Run Code Online (Sandbox Code Playgroud)
然后照片#show action包含:
if session[:query]
@next_photo = @photo.next(session[:query])
@prev_photo = @photo.previous(session[:query])
end
Run Code Online (Sandbox Code Playgroud)
最后,我的观点包含:
- if @prev_photo || @next_photo
#navigation
.header Related Photos
.prev
= link_to image_tag( @prev_photo.file.url :tenth ), collection_photo_path(@collection, @prev_photo) if @prev_photo
- if @prev_photo
%span Previous
.next
= link_to image_tag( @next_photo.file.url :tenth ), collection_photo_path(@collection, @next_photo) if @next_photo
- if @next_photo
%span Next
Run Code Online (Sandbox Code Playgroud)
现在事实证明这在常规浏览情况下效果很好 - 但有一个问题我还没有修复:
理论上,如果用户搜索视图,则跳转到他们在会话中生成查询的照片.如果由于某种原因,他们然后直接(通过URL或书签)浏览到上一个查询中的另一张照片,查询将在会话中保留,相关的照片链接仍将在第二张照片上显示 - 即使他们不应该在有人通过书签加载的照片上.
但是,在现实生活中的用例中,这种情况实际上很难重新创建,而且代码目前运行良好.在某些时候,我想出了一个很好的解决方案,我会发布它,但是现在,如果有人使用这个想法,请注意存在这种可能性.
| 归档时间: |
|
| 查看次数: |
5965 次 |
| 最近记录: |