Терминал говорит, что представление было визуализировано, но фактически не отображается в браузере? - PullRequest
1 голос
/ 06 февраля 2012

Следующий контроллер выполняет следующие действия:

Если идентификатор текущего пользователя существует в атрибуте 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) ВЫБРАТЬ "users". * FROM "users" WHERE "users". "Id" = 2 ORDER BY users.created_at ASC LIMIT 1 Предоставленные записи / show.html.erb в макетах / приложении (386,5мс) Выполнено 200 ОК за 428мс (Просмотры: 416,5 мс | ActiveRecord: 7,3 мс)

Есть предложения, чтобы это исправить? (кстати, более ли можно использовать редирект, если только here (как)?

1 Ответ

2 голосов
/ 06 февраля 2012

Перенаправление не работает, потому что вы вызываете метод vote_up через Ajax. Вы должны отобразить уведомление с помощью 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 вы отправляете обратно javascript в зависимости от того, пусты ли @notice и @vote.

<% unless @notice.blank? %>
  // javascript to display @notice
<% end %>

<% unless @vote.blank? %>
  // javascript to increase vote count
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...