以下控制器执行以下操作:
如果当前用户的ID存在于其中一个投票实例的user_id属性中,则当前用户将被重定向到此页面并发出通知,告知他或他已经投票。如果没有,投票将被投票并呈现views/votes/vote_up.js.erb
。
votes_controller.erb:
class VotesController < ApplicationController
def vote_up
@post = Post.find(params[:id])
if @post.votes.exists?(:user_id => current_user.id)
redirect_to @post, notice: 'You already voted'
else
@vote = @post.votes.create(:user_id => current_user.id, :polarity => 1)
respond_to do |format|
format.js
end
end
end
end
视图/帖/ show.html.erb:
<div class="post-<%=@post.id%>">
<h3><span class="vote-count"><%= @post.votes.count %></span>votes</h3><br />
<%= link_to "Vote Up", vote_up_path(@post), :remote => true, :class => "vote-up" %><br />
</div>
除了没有重定向用户并且没有出现通知外,一切正常。我只是在终端得到这个通知:
CACHE(0.0ms)SELECT“users”。* FROM“users”WHERE“users”。“id”= 2 ORDER BY users.created_at ASC LIMIT 1呈现的帖子/ show.html.erb 布局/应用内(386.5ms)完成200 OK,428ms(浏览次数: 416.5ms | ActiveRecord:7.3ms)
有任何解决此问题的建议吗? (顺便说一句,除非here
(如何),否则它更易于使用?
答案 0 :(得分:2)
重定向不起作用,因为您通过Ajax调用vote_up
方法。您应该使用javascript显示通知,就像您在用户尚未投票时所做的那样。
你可以这样做:
def vote_up
@post = Post.find(params[:id])
if @post.votes.exists?(:user_id => current_user.id)
@notice = 'You already voted'
else
@vote = @post.votes.create(:user_id => current_user.id, :polarity => 1)
end
respond_to do |format|
format.js
end
end
然后在.erb.js
文件中,根据@notice
和@vote
是否为空,发回javascript。
<% unless @notice.blank? %>
// javascript to display @notice
<% end %>
<% unless @vote.blank? %>
// javascript to increase vote count
<% end %>