[英]javascript - rails upvoting without act_as_votable gem and no refresh to update
我有一个Tip模式,其中任何用户都可以投票或向下投票,而Vrecord则是我保留投票日志的地方。 我也有Game模型,用户可以在其中添加提示。
在我的Vrecord上 ,一列包含tip_id和pos ,它们具有“ 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.