使用respond_to方法呈现js.erb部分

时间:2015-08-03 14:47:53

标签: ruby-on-rails ajax model-view-controller controller partial-views

我有一个功能,用户喜欢/不喜欢和不喜欢/不喜欢的菜肴。这就是我最初设置动作的方式:

菜肴控制器

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

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

1 个答案:

答案 0 :(得分:1)

我认为您应该在@dish.liked_by current_user之前致电render partial: "dishes/shared/vote.js.erb"。问题是@dish尚未更新。