使用 respond_to 方法渲染 js.erb 部分

Using the respond_to method to render a js.erb partial

我有一个功能,其中用户like/unlike和dislike/undislike菜。这就是我最初设置动作的方式:

菜品控制器

class DishesController < ApplicationController
  def like
    @dish.liked_by current_user
  end

  def dislike
    @dish.disliked_by current_user
  end
  ...
end

考虑到每个模板的 js.erb 模板完全相同,我想只创建一个共享部分供每个模板使用:

原始设置

# like.js.erb, unlike.js.erb,dislike.js.erb,undislike.js.erb

$(".restaurant__dish-vote--<%= @dish.modifier_class %>").html('<%= escape_javascript(render "restaurants/menu_partials/dish_votes", dish: @dish) %>');

新设置

# shared/_vote.js.erb

$(".restaurant__dish-vote--<%= @dish.modifier_class %>").html('<%= escape_javascript(render "restaurants/menu_partials/dish_votes", dish: @dish) %>');

现在我正在尝试重构我的控制器以反映这些更改,但 ajax 功能似乎不适用于以下内容:

class DishesController < ApplicationController
  def like
    respond_to do |format|
      format.js { render partial: "dishes/shared/vote.js.erb" }
    end

    @dish.liked_by current_user
  end
end

操作完成,但面向用户的更改仅在刷新时反映出来。我做错了什么?

我认为你应该在 render partial: "dishes/shared/vote.js.erb" 之前调用 @dish.liked_by current_user。问题是 @dish 还没有更新。