我的申请中的问题可以被赞成。但是,点击upvote按钮后页面会重新加载。我已经四处搜索并找到了通过jQuery实现的方法,因此页面不会重新加载,但我无法让它们工作(我是jQuery的新手)。请告诉我我必须添加什么来使这项工作。
以下是提出问题的链接:
<%= link_to "Upvote", upvote_comment_question_path(question.comment, question) %>
这是问题控制器中的upvote方法(现在它重定向回同一页面):
def upvote
@question = Question.find params[:id]
@question.liked_by current_user
redirect_to post_comment_path(@question.comment.post, @question.comment)
end
答案 0 :(得分:1)
你真正需要jQuery的是更新页面上的upvote计数。按照惯例,链接使用GET方法,但您正在修改某些内容,因此PUT是您想要的操作。您可以修改link_to的方法,也可以使用button_to进行自定义操作。
确保您的路线反映正确的操作:
resources :questions do
member do
put 'update_votes'
end
end
你想在你的视野中从这样的事情开始。
<% @questions.each do |q| %>
<div id="<%= q.id %>">
<%= link_to "Upvote", upvote_comment_question_path(q.comment, q), remote: true, method: :put %>
<div class="upvote-count"><%= q.upvote_count %></div>
<div class="question">Content</div><br />
</div>
<% end %>
您的div需要一个ID,以便在更新后可以找到它。
link_to中的 remote: true
使用AJAX提交,因此您的页面不会刷新。此时,您不希望您的upvote操作重定向到任何地方,您希望它执行upvote.js.erb
,这将是它的默认操作。修改控制器操作:
def upvote
@question = Question.find params[:id]
@question.liked_by current_user
end
upvote.js.erb
已经可以访问@question了,所以它只需要这样做:
$("#<%= @question.id %> .upvote-count").html("<%= @question.likes %>");
这应该更改您的upvote计数的值以匹配新值。