终端表示视图已呈现,但它实际上并未在浏览器中呈现?

时间:2012-02-06 06:53:49

标签: ruby-on-rails-3

以下控制器执行以下操作:

如果当前用户的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(如何),否则它更易于使用?

1 个答案:

答案 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 %>