Ruby on rails Rails 5上一篇或下一篇文章仅来自特定标签

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,它将列出索引中的所有标记。我不希望这样,我希望用户能够单击“上一步”或“下一步”,并且只能在与标记关联的帖子上单击

我有一个名为posts的资源,其中有很多。但是,每个帖子可以有多个标签。我希望用户能够转到上一篇文章和下一篇文章,只从选择的标签。我让它在上一个下一个中为数据库中的所有帖子工作,但是当我单击一个标记并显示所有标记时,上一个/下一个不符合标记的内容

如果我访问与routes.rb中定义的代码相关联的url,
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,我收到了这个错误