如何显示用户喜欢的所有帖子

时间:2016-05-25 22:05:35

标签: ruby-on-rails ruby devise voting-system acts-as-votable

我正在尝试显示当前用户喜欢的所有帖子。

我正在使用Ruby on Rails,以及宝石Devise和“Acts As Votable”。我一直关注the Acts As Votable guide,但无法使其发挥作用。

我认为这是要走的路:

@post.liked_by @user1
@post.downvote_from @user2

我创建了一个名为dashboard的新控制器:

class DashboardController < ApplicationController
  def index
        @post = Post.all.liked_by current_user
  end
end

但是当我运行网络时,我得到了:

undefined method `liked_by' for #<Post::ActiveRecord_Relation:0x9aa89b0>

我该怎么办?

2 个答案:

答案 0 :(得分:2)

在您的控制器中尝试@posts = current_user.find_up_voted_items并将acts_as_voter放入您的用户模型中。

答案 1 :(得分:2)

问题在于您在ActiveRecord关系上调用它,而不是在模型对象本身上调用它。一些微小的变化,你将全部完成。

首先,我们将实例变量设为复数,以表明它接收多条记录(用户可以喜欢多个帖子):

class DashboardController < ApplicationController
  def index
    @posts = Post.all.liked_by current_user
  end
end

然后,要处理这些,您需要导航到单个记录或记录。如果要处理整个列表,可以执行以下操作:

@posts.each do |post|
  post.liked_by @user1
  post.downvote_from @user2
end

这将对所有帖子应用like和downvote。但是,您只能更新第一篇文章,如下所示:

post = @posts.first
post.liked_by @user1
post.downvote_from @user2

如果您已经知道要投票的帖子(可能基于在UI中选择的帖子),您可以这样做:

@post = Post.find_by(params[:id])
@post.liked_by @user1
@post.downvote_from @user2

确保将复数和单数名称保持不同将有助于您与Rails惯例保持一致,并帮助您轻松识别何时使用集合或单个对象。