Ruby on Rails下一篇/上一篇文章
我有一个索引页面 - posts #index,其中包含指向每个帖子的节目页面的链接。每个帖子都引用了一个特定的主题,并且可能是在不同的时间创建的,因此帖子的ID不一定是该主题中所有帖子的顺序。我希望能够进入下一个&特定主题的先前帖子。
在我的PostsController中,我有一个主题的所有帖子的实例变量以及显示的特定主题
def index
@topic = Topic.find(params[:topic_id])
@posts = @topic.posts.all
end
def show
@topic = Topic.find(params[:topic_id])
@posts = @topic.posts.all
@post = @topic.posts.find(params[:id])
end
@posts是一个活动记录对象数组
@posts => #<ActiveRecord::AssociationRelation [
#<Post id: 73, topic_id: 3>,
#<Post id: 74, topic_id: 3>,
#<Post id: 76, topic_id: 3>,
#<Post id: 77, topic_id: 3>,
#<Post id: 91, topic_id: 3>]
如果这是一个ruby对象数组,我可以使用@posts.index(@post)
来查找数组中特定元素的id,然后执行index + 1
或index - 1
来遍历数组帖子,但.index
是活动记录中的另一种方法。如果我在某个特定主题的任何特定帖子的展示页面上,例如Post id: 76
,我该如何以某种方式转到link_to Post id: 74
(下一个)和link_to Post id: 77
(之前)适用于特定主题的任何帖子?
答案 0 :(得分:1)
您可以执行以下操作:
def show
@topic = Topic.find(params[:topic_id])
posts = @topic.posts.order('posts.id ASC')
@post = posts.find(params[:id])
@previous_post = posts.where('posts.id < ?', @post.id).first
@next_post = posts.where('posts.id > ?', @post.id).first
end
答案 1 :(得分:0)
尝试这样的事情:
some_topic.posts.where("id > ?", 74).order(:id).first
或者,如果您有一些主题(不确定您的型号),但它看起来与此类似:
74
此处$('#email_preview').click(function (event) { // <-- it should be 'event' btw
event.preventDefault();
my_js_function("{{ form.modchoicfield }}"); // <-- no need for 'data'
});
是当前帖子的ID。
答案 2 :(得分:0)
有一些宝石值得帮助。我创建了一个退出灵活的,因为它可以动态地与任何集合及其顺序一起工作(当硬编码为Book.where("id > ?", 74).order(:id)
时不是这种情况)
gem名为nexter,其基本用法如下:
@books = Book.includes(:author).bestsellers.
order("genre", "authors.name", "published_at desc")
nexter = Nexter.wrap( @books, @books.find(params[:id]) )
nexter.previous
nexter.next
有关详细信息,请参阅README。