Почему этот атрибут работает в этом представлении html.erb, но не в этом другом представлении js.erb (Rails)? - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть модель сообщений, комментариев и голосов

Каждый раз, когда создается экземпляр модели 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 />

пример voice_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), если он прикреплен к show.html.erb через Ajax из этого файла:

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 Ответ

1 голос
/ 08 февраля 2012

Вы загружаете объект @post, затем изменяете его в обратных вызовах модели Vote, но объект @post не знает об этом изменении и продолжает использовать свои кэшированные результаты из базы данных. Вы можете принудительно перезагрузить его, поставив @post.reload сразу после вашей строки @post.votes.create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...