繁体   English   中英

javascript-在没有act_as_votable gem的情况下进行Rails投票并且没有刷新来更新

[英]javascript - rails upvoting without act_as_votable gem and no refresh to update

我有一个Tip模式,其中任何用户都可以投票或向下投票,而Vrecord则是我保留投票日志的地方。 我也有Game模型,用户可以在其中添加提示。

在我的Vrecord上 ,一列包含tip_idpos ,它们具有“ u”或“ d”变量,以指示其赞成或反对表决,因此我可以限制每个IP的投票权。 如果有一个“ u”,它将不再允许IP向上投票,但是如果它被拒绝,它将删除“ 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

下票看起来几乎一样。 我投票后刷新页面。 但是我希望它自己更新而不刷新,这需要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 %>

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

谢谢!

remote: true添加到链接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 %>")

控制器表决动作:

  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

而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM