在我的Rails 4应用中,我有Post
和Calendar
模型:calendar
has_many
post
和post
belong_to
calendar
。
在位于post
的{{1}} show.html.erb
视图中,我希望允许用户在当前帖子所属的日历帖子之间来回导航, “上一篇文章”按钮和“下一篇文章”按钮。
以下是我的路线:
/posts/:id
我知道我的resources :calendars do
resources :posts, shallow: true
end
end
post
视图中会有类似内容:
show.html.erb
到目前为止,在我的<% if @calendar.posts.count > 1 %>
<%= link_to "< Previous", @previous_post %> | Post Preview | <%= link_to "Next >", @next_post %>
<% else %>
Post Preview
<% end %>
中,我提出了:
PostsController
但是,我正在努力想出def show
@calendar = Calendar.find_by_id(@post.calendar_id)
@posts = @calendar.posts
@previous_post = @post.previous
@next_post = @post.next
end
和previous
方法的正确定义(您可以在上面的next
代码中看到)。
这些方法必须允许我分别找到PostsController
我怎样才能做到这一点?
答案 0 :(得分:4)
使用相对于日期next
和previous
命令的解决方案很好,但不能完全正常工作,因为您还需要按时间顺序order
结果。 where
将过滤掉您不想要的内容,但您需要确保其余内容符合您的要求。
所以你有类似的东西:
def next
calendar.posts.where("time > ?", time).order(:time).first
end
def previous
calendar.posts.where("time < ?", time).order(time: :desc).first
end
编辑: 我假设时间是DateTime。如果它只是一个没有日期信息的时间,您将迫切希望将其更改为DateTime字段。
答案 1 :(得分:1)
这不是一种非常理想的解决方案,但在您的情况下,应该工作并从previous
数组中为您提供next
和@post
的{{1}}帖子。
添加@posts
辅助方法并在控制器的get_next_previous_posts
方法中使用它:
show
答案 2 :(得分:0)
听起来你需要一些分页。 will_paginate或kaminari宝石应该做的伎俩(我更喜欢kaminari)。
答案 3 :(得分:0)
这就是我最终做的事情:
def next
calendar.posts.where("id > ?", id).first
end
def previous
calendar.posts.where("id < ?", id).last
end
def show
@calendar = Calendar.find_by_id(@post.calendar_id)
@previous_post = @post.previous
@next_post = @post.next
end
这不是一个理想的解决方案,但它正在发挥作用。
- - - -
<强>更新强>:
由于帖子必须按时间顺序显示,我必须将上述代码更改为:
#post.rb
def next
calendar.posts.where("time > ?", time).first
end
def previous
calendar.posts.where("time < ?", time).last
end
然而,这并不完美,正如你在这个gif上看到的那样:
几乎好像上一个按钮仍然基于帖子id
而不是时间。
我确实重新启动了我的服务器以防出现问题,但它没有修复它。
知道如何改进此代码吗?
- - - -
更新2 :根据 Richard Seviora 的回答,我也试过了:
#post.rb
def next
calendar.posts.where("date > ? AND time != ?", date, time).order(:time).first
end
def previous
calendar.posts.where("date < ? AND time != ?", date, time).order(time: :desc).first
end
仍未按预期工作。
- - - -