在acts_as_votable上销毁UpVotes

时间:2015-03-11 22:05:28

标签: ruby-on-rails ruby rubygems public-activity

我有一个使用acts_as_votable工作正常的rails应用程序。类似按钮支持帖子计数,然后切换到一个不喜欢的按钮,这样就可以对帖子计数进行投票。

我的问题是,自从我开始使用Public Activity gem以来,我无法找到从Feed中删除喜欢的方法。我在活动索引视图中使用了以下循环:

<% @activities.each do |activity| %>
    <p>
        <% if activity.trackable %>
            <%= link_to activity.owner.name, activity.owner %>
            <%= render_activity activity %>
        <% end %>
    </p>
<% end %>

当我删除评论时,&f; FOO的活动Feed中的整行都添加了关于BAR&#39;消失。然而,因为作为可投票宝石的行为实际上创造了一个downvote而不是破坏了upvote,所以线条&#39; FOO喜欢BAR&#39;仍然会出现,随后会被“FOO unliked BAR&#39;”跟随。

有人知道我如何通过特定帖子上的current_user找到upvote,然后将其销毁?

下面是我喜欢的控制器代码,不像现在这样:

def like
  @ink.create_activity :like, owner: current_user
  @ink.upvote_by current_user

  redirect_to :back
end

def unlike
  @ink.downvote_by current_user

  redirect_to :back
end

由于

3 个答案:

答案 0 :(得分:4)

我知道这已经得到了解答,但理想和最简单的答案是使用官方宝石方法 unvote_by 它适用于upvotes和downvotes。

答案 1 :(得分:2)

看起来你想要做的就是删除模型,就像通知“不喜欢” - 这是正确的吗?您所要做的就是找到相关活动并销毁它。由于活动是与其他活动一样的模型,因此您可以使用destroy和/或destroy_all执行此操作。

我不太确定你的public_activity模型是什么样的,所以我没有给出具体的例子,而是将你链接到gem的邮件列表上的this post,其中显示了删除公共活动记录的示例

您可能还会发现通过trackable_id删除记录很有用 - 例如:

@activity = PublicActivity::Activity.find_by(trackable_id: (params[:id]), trackable_type: controller_path.classify)
@activity.destroy

有关{* 3}}的工作原理的更多信息。

答案 2 :(得分:2)

对于任何偶尔会遇到这种情况的人,多亏了Element119,我最终能够通过一些变量和搜索来确定当前用户喜欢的特定帖子。然后我摧毁了精确定位的喜欢。

def like
    @post.create_activity  :like, 
                           owner: current_user,
                           recipient: @post.user
    @post.upvote_by current_user

    redirect_to :back
  end



def unlike
    @post.downvote_by current_user

    @currentUserLikes = PublicActivity::Activity.where(trackable_id: @post.id, owner_id: current_user.id, key: "post.like")
    @currentUserLikes.destroy_all

    redirect_to :back
  end