Jquery Rails:更新投票数';计票';使用Ajax

Jquery Rails:更新投票数';计票';使用Ajax,jquery,ruby-on-rails,ruby,ajax,Jquery,Ruby On Rails,Ruby,Ajax,我的rails应用程序中有一个非常简单的向上投票系统。每次有人投票时,我都会通过ajax请求更新投票数。但我不知道我错过了什么 app/controllers/pin_controller.rb def upvote @pin = Pin.friendly.find(params[:id]) @pin.votes.create(user_id: current_user.id) respond_to do |format| format.json { render jso

我的rails应用程序中有一个非常简单的向上投票系统。每次有人投票时,我都会通过ajax请求更新投票数。但我不知道我错过了什么

app/controllers/pin_controller.rb

def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
    respond_to do |format|
    format.json { render json: { count: @pin.votes_count } }
 end
end
<span class='pin-<%=pin.id%>'>
  <%= link_to upvote_pin_path(pin), method: :put, remote: true do %>         
      <% if pin.votes.where(user_id: current_user.id).empty? %>
         <i class="fa fa-star"></i>
      <%= pin.votes.count %>
</span>
$("pin-<%=pin.id%>").html('<%=escape_javascript pin.votes.count %>');
def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
  respond_to do |format|
    format.js # no need to pass a variable here
 end
end
app/views/pins/index.html.erb

def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
    respond_to do |format|
    format.json { render json: { count: @pin.votes_count } }
 end
end
<span class='pin-<%=pin.id%>'>
  <%= link_to upvote_pin_path(pin), method: :put, remote: true do %>         
      <% if pin.votes.where(user_id: current_user.id).empty? %>
         <i class="fa fa-star"></i>
      <%= pin.votes.count %>
</span>
$("pin-<%=pin.id%>").html('<%=escape_javascript pin.votes.count %>');
def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
  respond_to do |format|
    format.js # no need to pass a variable here
 end
end

*app/views/pins/upvote.js.erb

def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
    respond_to do |format|
    format.json { render json: { count: @pin.votes_count } }
 end
end
<span class='pin-<%=pin.id%>'>
  <%= link_to upvote_pin_path(pin), method: :put, remote: true do %>         
      <% if pin.votes.where(user_id: current_user.id).empty? %>
         <i class="fa fa-star"></i>
      <%= pin.votes.count %>
</span>
$("pin-<%=pin.id%>").html('<%=escape_javascript pin.votes.count %>');
def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
  respond_to do |format|
    format.js # no need to pass a variable here
 end
end
$(“pin-”).html(“”);
你知道我缺少什么来让它工作吗

更新: 来自控制台的错误:

发送jquery.js?body=1:9667jQuery.extend.ajax jquery.js?body=1:9212$.rails.rails.ajax jquery\u ujs.js?body=1:81$.rails.rails.handleRemote jquery\u ujs.js?body=1:157(匿名函数)jquery\u ujs.js?body=1:307jQuery.event.dispatch jquery.js?body=1:4625elemData.handle

服务器日志错误:

ActionView::Template::Error(3:Fixnum的未定义方法
gsub):
1:$(“.pin-”).html(“”);
app/views/pins/upvote.js.erb:1:in
\u app\u views\u pins\u upvote\u js\u erb\u 4096032730150237755\u 70323561115600' app/controllers/pins_controller.rb:53:in'upvote'

解决方案:

将此行修改为in upvote.js.erb:


$(“.pin-”).html(“”)

使用“format.js”,而不是“format.json”。

您有几个错误:

app/controllers/pin_controller.rb

def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
    respond_to do |format|
    format.json { render json: { count: @pin.votes_count } }
 end
end
<span class='pin-<%=pin.id%>'>
  <%= link_to upvote_pin_path(pin), method: :put, remote: true do %>         
      <% if pin.votes.where(user_id: current_user.id).empty? %>
         <i class="fa fa-star"></i>
      <%= pin.votes.count %>
</span>
$("pin-<%=pin.id%>").html('<%=escape_javascript pin.votes.count %>');
def upvote
  @pin = Pin.friendly.find(params[:id])
  @pin.votes.create(user_id: current_user.id)
  respond_to do |format|
    format.js # no need to pass a variable here
 end
end
app/views/pins/index.html.erb您没有将


*app/views/pins/upvote.js.erbjQuery选择器错误,变量调用也错误

$(".pin-<%=@pin.id%>").html('<%= @pin.votes.count.to_s %>');
$(“.pin-”).html(“”);

谢谢你的回答,菲利克斯。不幸的是,页面仍然需要刷新以显示更新后的值检查服务器是否以JS响应。为此,打开Chrome开发者工具的“网络”选项卡,单击“投票”,然后查看发送的请求。响应应该类似于“$(“.pin-12”).html('21');”。如果不是,请检查服务器日志中是否有任何错误。我无法理解日志中的错误。如果有错误,请使用返回的服务器日志中的错误(运行
rails s
)编辑我的答案