为什么这个属性在这个html.erb视图中有效但在其他js.erb视图(Rails)中没有?

时间:2012-02-08 19:32:30

标签: ruby-on-rails-3

我有帖子,评论和投票模型

每次创建Vote模型的实例时(使用:polarity +1或-1),它都会更新其所属帖子的total_votes列:

vote.rb:

class Vote < ActiveRecord::Base
  belongs_to :votable, :polymorphic => true
  belongs_to :user

  before_create :update_total

  protected

  def update_total
    total_average = self.votable.total_votes
    self.votable.update_attribute(:total_votes, total_average + self.polarity)
  end
end

这就是我在 show.html.erb 视图中调用的方式:

  <div class="post-<%= @post.id %>">
   <h3><span class="vote-count"><%= @post.total_votes %></span> votes</h3><br />

votes_controller.rb 的例子:

 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

routes.rb中:

 get 'votes/:id/vote_up' => 'votes#vote_up', as: 'vote_up'

由于某种原因@ post.total_votes给出0,该列的默认值(无论其实际值是-1还是1),如果它通过Ajax从此文件附加到show.html.erb:

vote_up.js.erb:

<% unless @notice.blank? %>
  alert("<%= @notice %>");
<% end %>

<% unless @vote.blank? %>
  $('.post-<%=@post.id%> span.vote-count').html('<%= @post.total_votes %>');
  $('.post-<%=@post.id%> div.voted-user').html('<% @post.votes.each do |vote| %><%= link_to vote.user.username, vote.user %><% end %>');
<% end %>

有任何解决此问题的建议吗?

1 个答案:

答案 0 :(得分:1)

您正在加载@post对象,然后在Vote模型的回调中更改它,但@post对象不知道此更改并继续使用其缓存结果来自数据库。您可以在@post.reload行之后放置@post.votes.create来强制重新加载。