如果不使用 `.js.erb`,如何在 AJAX 请求后动态更新 DOM 元素?

How do I dynamically update a DOM element after an AJAX request if not using a `.js.erb`?

所以我有一个 link/button 在我的助手中看起来像这样 class:

link_to "UnFav", unfavorite_node_path(node), class: "btn btn-success favorite", method: :post, remote: true,  data: { toggle_text: 'Fav', toggle_href: favorite_node_path(node), id: node.id }

在我的控制器中调用这些方法:

  def favorite
    @node.liked_by current_user

    if request.xhr?
      render json: { count: @node.get_likes.size, id: params[:id] }
    else
      redirect_to @node
    end
  end

  def unfavorite
    @node.unliked_by current_user
    if request.xhr?
      render json: { count: @node.get_likes.size, id: params[:id] }
    else
      redirect_to @node
    end
  end      

我正在使用 acts-as-votable

在我看来,我会像这样显示对特定 node 的投票数:

<span class="card-favorite-count">
   <i class="icon-heart"></i> <%= node.cached_votes_total %>          
</span>

理想情况下,我想要发生的是,当按下其中一个链接并且成功执行操作时,我想更新已经显示在 DOM 中的计数。

我尝试创建一个 favorite.js.erb 并将其放入其中:

$(".card-favorite-count").html('<%= node.cached_votes_total %>');

但我意识到,当我收藏和取消收藏一个项目时,在我的服务器日志中它从来没有调用过那个 favorite.js.erb 模板 - 所以它永远不会被执行。

我也在 gem 上寻找回调,但找不到。

解决这个问题的最佳方法是什么?

要呈现文件 favorite.js.erb,您需要执行以下操作:

  def favorite
    @node.liked_by current_user
      respond_to do |format|
        format.js
        format.html{ redirect_to @node }
      end
    end
  end

我认为 if 块不是必需的,但您可以尝试上面的代码。当它是一个 js 请求时它会用 js.erb 响应,当它是 html 请求时它会重定向。