Ruby on Rails 5 js.erb не передается переменная текущего экземпляра - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть модель комментариев с похожими / непохожими функциями, и когда мне нравится любой комментарий в первый раз, он работает правильно, потому что аналогичная ссылка была отображена с исходной визуализацией html.erb.Но когда я пытаюсь что-то отличать или повторять, он всегда обновляет партиалы со ссылкой на первый комментарий, который мне понравился или не понравился, соответственно.

comments_controller.rb

def like
    @comment = Comment.find(params[:id])
    @comment.liked_by current_user
    respond_to do |format|
      format.html { redirect_to :back }
      format.js { render '/comments/like.js.erb' }# layout: false }
    end   
  end

  def unlike
    @comment = Comment.find(params[:id])
    @comment.unliked_by current_user
    respond_to do |format|
      format.html { redirect_to :back }
      format.js { render '/comments/unlike.js.erb' }# layout: false }
    end 
  end

в отличие от.js.erb

$('.unlike_comment').bind('ajax:success', function(){

   $(this).parent().parent().find('.vote_count').html('<%= escape_javascript @comment.votes_for.size.to_s %>');
   $(this).closest('.unlike_comment').hide();

   $(this).closest('.votes').html(' <%= link_to "", like_comment_path(@comment), remote: true, method: :get, class: 'like_comment glyphicon glyphicon-chevron-up', :style=>'color: #cecece;' %>');

});

like.js.erb

$('.like_comment').bind('ajax:success', function(){

   $(this).parent().parent().find('.vote_count').html('<%= escape_javascript @comment.votes_for.size.to_s %>');
   $(this).closest('.like_comment').hide();

   $(this).closest('.votes').html(' <%= link_to "", unlike_comment_path(@comment), remote: true, method: :get, class: 'unlike_comment glyphicon glyphicon-chevron-up', :style=>'color: #202020;' %>');

});

И соответствующая часть _comment.html.erb

 <comment-body>
      <p>
      <span class="votes">
      <% if logged_in? && (current_user.liked? comment) %>
         <%= link_to "", unlike_comment_path(comment), method: :get, remote: true, class: 'unlike_comment glyphicon glyphicon-chevron-up', :style=>'color: #202020;' %>
      <% elsif logged_in? %>
         <%= link_to "", like_comment_path(comment), method: :get, remote: true, class: 'like_comment glyphicon glyphicon-chevron-up', :style=>'color: #cecece;' %>
      <% else %>
        <%= link_to "", prompt_login_comment_path(comment), method: :get, remote: true, class: 'prompt_login glyphicon glyphicon-chevron-up', :style=>'color: #cecece;' %>
      <% end %>

    </span>
    <%= link_to comment.title, comment, class: 'bigger comment-text' %> <%= link_to comment.body, comment, class: 'notbig comment-text' %>
    </p>
    </comment-body>

Так, например,если мне не нравится комментарий 4, то, как и комментарий 3, он изменит ссылку непохожих в частичном комментарии 3 на комментарии / 4 / другому.Что может пойти не так, чтобы это произошло?Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 19 ноября 2018

Ваш обратный вызов должен быть нацелен на фиксированный класс DOM, в противном случае обработчик событий будет перезаписываться каждый раз, когда ajax успешен (что и происходит).Также вам нужно только обновить атрибуты привязки, а не перерисовывать всю привязку, используя метод html.

Сначала создайте уникальный класс для каждой ссылки, например, comment_1

    <span class="votes">
      <% if logged_in? && (current_user.liked? comment) %>
         <%= link_to "", unlike_comment_path(comment), method: :get, remote: true, class: 'unlike_comment comment_#{comment.id} glyphicon glyphicon-chevron-up', :style=>'color: #202020;' %>
      <% elsif logged_in? %>
         <%= link_to "", like_comment_path(comment), method: :get, remote: true, class: "like_comment comment_#{comment.id} glyphicon glyphicon-chevron-up", :style=>'color: #cecece;' %>
      <% else %>
        <%= link_to "", prompt_login_comment_path(comment), method: :get, remote: true, class: 'prompt_login glyphicon glyphicon-chevron-up', :style=>'color: #cecece;' %>
      <% end %>
    </span>

Затем обновите unlike.js.erb шаблон (делает наоборот like.js.erb):

$("." + "comment_#{@comment.id}").bind('ajax:success', function(){
   // Change class
   $(this).switchClass("like_comment", "unlike_comment");
   // Change path
   $(this).prop("src", "#{like_comment_path(comment)}");
   // anything else....
});

Дайте мне знать, если это работает.

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