Ruby on rails Rails 5上一篇或下一篇文章仅来自特定标签
我有一个名为posts的资源,其中有很多。但是,每个帖子可以有多个标签。我希望用户能够转到上一篇文章和下一篇文章,只从选择的标签。我让它在上一个下一个中为数据库中的所有帖子工作,但是当我单击一个标记并显示所有标记时,上一个/下一个不符合标记的内容 如果我访问与routes.rb中定义的代码相关联的url,Ruby on rails Rails 5上一篇或下一篇文章仅来自特定标签,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个名为posts的资源,其中有很多。但是,每个帖子可以有多个标签。我希望用户能够转到上一篇文章和下一篇文章,只从选择的标签。我让它在上一个下一个中为数据库中的所有帖子工作,但是当我单击一个标记并显示所有标记时,上一个/下一个不符合标记的内容 如果我访问与routes.rb中定义的代码相关联的url,get'tags/:tag',to'posts#index',as::tag,它将列出索引中的所有标记。我不希望这样,我希望用户能够单击“上一步”或“下一步”,并且只能在与标记关联的帖子上单击
get'tags/:tag',to'posts#index',as::tag
,它将列出索引中的所有标记。我不希望这样,我希望用户能够单击“上一步”或“下一步”,并且只能在与标记关联的帖子上单击
注意:我使用的是友好id宝石
controller/posts\u controller.rb
def index
@posts = Post.all
if params[:tag]
@posts = Post.tagged_with(params[:tag])
else
@posts = Post.all
end
end
# tags
acts_as_taggable # Alias for acts_as_taggable_on :tags
def next
Post.where("id > ?", id).order(id: :asc).limit(1).first
end
def prev
Post.where("id < ?", id).order(id: :desc).limit(1).first
end
<%= link_to "← Previous Question", @post.prev, :class => 'button previous-question' %>
<%= link_to "Next Question →", @post.next, :class => 'button next-question' %>
# TAGS
get 'tags/:tag', to: 'posts#index', as: :tag
型号/post.rb
def index
@posts = Post.all
if params[:tag]
@posts = Post.tagged_with(params[:tag])
else
@posts = Post.all
end
end
# tags
acts_as_taggable # Alias for acts_as_taggable_on :tags
def next
Post.where("id > ?", id).order(id: :asc).limit(1).first
end
def prev
Post.where("id < ?", id).order(id: :desc).limit(1).first
end
<%= link_to "← Previous Question", @post.prev, :class => 'button previous-question' %>
<%= link_to "Next Question →", @post.next, :class => 'button next-question' %>
# TAGS
get 'tags/:tag', to: 'posts#index', as: :tag
然后,您可以将其放在控制器中,
Post.where([“id<?”,id])。上一个是最后一个,下一个是Post.where([“id>?”,id])。第一个是下一个
你要做的是控制器的工作。您可以根据您的排序来扩展它们
我也发现了。使用起来会更好。我认为您必须传递标记
参数(尽管您可能应该将其作为帮助器方法)
models/post.rb
def next tag
Post.where("id > ?", id).tagged_with(tag).order(id: :asc).limit(1).first
end
def prev tag
Post.where("id < ?", id).tagged_with(tag).order(id: :desc).limit(1).first
end
def next tag
result = Post.where("id > ?", id).tagged_with(tag).order(id: :asc).limit(1).first
result || very_first(tag)
end
def prev tag
result = Post.where("id < ?", id).tagged_with(tag).order(id: :desc).limit(1).first
result || very_last(tag)
end
def very_first tag
Post.tagged_with(tag).order(id: :asc).limit(1).first
end
def very_last tag
Post.tagged_with(tag).order(id: :asc).limit(1).last
end
def下一个标记
Post.where(“id>?”,id).taged_with(tag).order(id::asc).limit(1).first
结束
def prev标签
Post.where(“id<?”,id)。用(tag)标记。顺序(id::desc)。限制(1)。第一
结束
展示
”按钮上一个问题“%”
'按钮下一个问题'%>
控制器/posts_controller.rb
class PostsController < ApplicationController
helper_method :current_tag
#def show
#def index
private
def current_tag
params[:tag]
end
end
class PostsController < ApplicationController
helper_method :current_tag
#def show
#def index
private
def current_tag
params[:tag]
end
end
class PostsController
这里是肖恩的最新答案。现在应该可以了。当prev
或next
方法返回nil
models/post.rb
def next tag
Post.where("id > ?", id).tagged_with(tag).order(id: :asc).limit(1).first
end
def prev tag
Post.where("id < ?", id).tagged_with(tag).order(id: :desc).limit(1).first
end
def next tag
result = Post.where("id > ?", id).tagged_with(tag).order(id: :asc).limit(1).first
result || very_first(tag)
end
def prev tag
result = Post.where("id < ?", id).tagged_with(tag).order(id: :desc).limit(1).first
result || very_last(tag)
end
def very_first tag
Post.tagged_with(tag).order(id: :asc).limit(1).first
end
def very_last tag
Post.tagged_with(tag).order(id: :asc).limit(1).last
end
def下一个标记
结果=Post.where(“id>?”,id)。用(tag.order(id::asc)。limit(1)。first
结果| |非常|优先(标记)
结束
def prev标签
结果=Post.where(“id<?”,id)。用(tag)标记。顺序(id::desc)。限制(1)。首先
结果| |最后一个(标记)
结束
def very_第一个标签
Post.taged_with(tag).order(id::asc).limit(1).first
结束
def very_最后一个标签
Post.taged_with(tag).order(id::asc).limit(1).last
结束
展示
'按钮上一个问题'%>
'按钮下一个问题'%>
控制器/posts_controller.rb
class PostsController < ApplicationController
helper_method :current_tag
#def show
#def index
private
def current_tag
params[:tag]
end
end
class PostsController < ApplicationController
helper_method :current_tag
#def show
#def index
private
def current_tag
params[:tag]
end
end
class PostsController
另外,对不起,肖恩,我不能对你的答案发表评论,所以我只是复制并修复了它你也可以采用嵌套资源的方法,像这样更改你的路线:
resource :tag do
resource :post
end
它应该为您提供路由结构,以便/tags/:tag\u id/posts
将指向给定标记的所有帖子,而/tags/:tag\u id/posts/:id
将指向使用该标记标记的确切帖子(或问题?)
然后在posts控制器中,您应该在\u filter之前添加:如下设置\u标记
before_filer :set_tag
def set_tag
@tag = Tag.find(params[:tag_id])
end
def index
@posts = @tag.posts
end
索引操作如下所示
before_filer :set_tag
def set_tag
@tag = Tag.find(params[:tag_id])
end
def index
@posts = @tag.posts
end
并且将始终显示该标签的帖子
在posts控制器的显示操作中,您可以获得下一个和上一个post链接,就像上面的答案一样
您还应该更改视图中使用的所有post url帮助程序,以包括当前标记,例如posts\u path
->tag\u posts\u path(@tag)
其中标记是在过滤器之前设置的当前标记
我强烈建议您不要将所有这些方法都放在模型上,并为帖子创建presenter对象,例如
class PostPresenter
attr_reader :post
alias_method :current, :post
def initialize(post)
@post = post
@repo = post.class
end
def next
@repo.where('id > ?', post.id).first
end
def previous
@repo.where('id < ?', post.id).first
end
end
但是当我点击一个标签,它会显示所有的标签时
你能再解释一下吗?它将在哪里显示所有标签?你能为此添加代码吗?我已经更新了帖子@NarasimhaReddySo当点击一个标签并显示其相关帖子时,你想为这些帖子列表分页吗?@arjun每当点击一个标签并显示相关帖子列表时,我想让用户点击任何一篇帖子并向后或向前,但只针对那个标签。(因此是上一个和下一个)。我正试图让用户一次只能看到一个。这只适用于帖子,我已经有了这个功能。我想要的是“上一个”或“下一个”,这取决于标记。你说的“取决于标记”是什么意思?如果用户在posts控制器中单击“上一个”或“下一个”,则可以正常工作,因为它都在数据库中。然而。。如果用户单击某个标签,如“水果”,则只有在用户单击标签上的“水果”时,才会显示标有“水果”的帖子。所有的帖子都有标签,我只想在用户点击任何标签时,在“上一个和下一个按钮”中显示相关帖子。对不起,如果之前不清楚,你能再解释一下发生了什么事吗?也。。我犯了这个错误。发生了什么事?在为model.rb编写next和tag时,是否应该在两者之间留一个空格<代码>ActionController::UrlGenerationError at/posts/1没有路由匹配{:action=>“show”,:controller=>“posts”,:id=>nil,:tag=>nil},可能的不匹配约束:[:id]
next和tag之间应该有一个空格,因为它是方法的参数。(如果愿意,可以将其放在括号中,尽管ruby中不需要它)。至于错误,我认为我在视图中的实现中弄糟了。您需要将id传递给url\u助手(我想,让我来编辑它)。但是,我不知道为什么tag参数是nil,。我们正在做的是将标签作为当前标签
传递给每个请求,然后在next
或post
中,我们用当前标签
重新评估范围。嘿@Sean,我收到了这个错误