javascript - 没有act_as_votable gem的rails upvoting,没有刷新更新

时间:2018-01-29 11:53:20

标签: javascript ruby-on-rails ajax

我有提示模型,其中任何用户都可以upvote或downvote,而Vrecord我保留投票日志。我还有游戏模型,用户可以在其中添加提示。

在我的 Vrecord 上,列包含 tip_id pos ,其中包含“u”或“d”变量,以告知其是否为upvote或者downvote所以我可以限制他们对每个IP的投票。如果存在“u”,它将不再允许IP上升,但如果它是downvotes,它将删除“u”,反之亦然。

我没有使用act_as_votable gem,我知道我应该拥有。当我学习红宝石时,我做了这个投票系统。它真的很乱,但请看看。

def upvote
    t = Tip.find(params[:id]) 
    gm = Game.find(v.game_id)
    ip = request.ip
    unless Vrecord.exists?(:ip => ip, :tip_id => t.id, :pos => "u")
      Tip.increment_counter(:votes, t.id)
      if Vrecord.exists?(:ip => ip, :tip_id => t.id, :pos => "d")
        rec = Vrecord.where(:ip => ip, :tip_id => t.id, :pos => "d")
        rec.delete(rec.ids)
      end
      @vrecord = Vrecord.new(:ip => ip, :tip_id => t.id, :pos => "u")
      @vrecord.save      
    end
    respond_to do |format|
      format.html { redirect_to champion_path(ch, anchor:'countertip') }
    end
  end

downvote看起来几乎一样。我在投票后刷新页面。但我希望它自己更新而不需要刷新,这需要javascript,我基本上一无所知从哪里开始。我试过搜索但是我一直都没有成功,因为我看到的答案使用了act_as_votable gem。

这是关于视图的提示表的一部分:

<% @tips.limit(5).order('votes DESC').each do |tip| %>
<td id = "votebox">
        <div><%= link_to image_tag('', class: "uparrow"), tip_upvote_path(tip, :id => tip.id), method: :put, class: "tip_upvote" %></div>
        <div><%= link_to image_tag('', class: "downarrow"), tip_downvote_path(tip, :id => tip.id), method: :put, class: "tip_downvote" %></div>
</td>
<td class="vote_count"><%= tip.votes %></td>
<% end %>

我所知道的是我必须在link_to上放置remote:true,在控制器中的upvote函数上添加render format.js,然后创建一个upvote.js.erb。我该如何使用javascript?

谢谢!

1 个答案:

答案 0 :(得分:0)

remote: true添加到链接,将id添加到投票计数td

<% @tips.limit(5).order('votes DESC').each do |tip| %>
<td id = "votebox">
    <div><%= link_to image_tag('', class: "uparrow"), tip_upvote_path(tip, :id => tip.id), remote: true, method: :put, class: "tip_upvote" %></div>
    <div><%= link_to image_tag('', class: "downarrow"), tip_downvote_path(tip, :id => tip.id), remote: true, method: :put, class: "tip_downvote" %></div>
</td>
<td class="vote_count" id="vote-count-<%= tip.id %>"><%= tip.votes %></td>
<% end %>

使用代码创建 upvote.js.erb 以更新投票计数:

$('#vote-count-<%= @tip.id %>').text("<%= @tip.votes %>")

控制器 upvote 操作:

  def upvote
    @tip = Tip.find(params[:id]) 
    gm = Game.find(v.game_id)
    ip = request.ip
    unless Vrecord.exists?(:ip => ip, :tip_id => @tip.id, :pos => "u")
      Tip.increment_counter(:votes, @tip.id)
      if Vrecord.exists?(:ip => ip, :tip_id => @tip.id, :pos => "d")
        rec = Vrecord.where(:ip => ip, :tip_id => @tip.id, :pos => "d")
        rec.delete(rec.ids)
      end
      @vrecord = Vrecord.new(:ip => ip, :tip_id => @tip.id, :pos => "u")
      @vrecord.save      
    end

    respond_to do |format|
      format.js
    end
  end

就是这样。