用户根据他们完成的里程碑数量获得积分。我有一个用户使用Ajax完成的里程碑列表,应该将Milestone点添加到用户点。
数据库正确更新并正确刷新页面更新,但是在Ajax调用之后没有呈现部分更新。
我认为这与before_update
回调有关,但在我的生活中无法弄明白。
控制器 milestones_controller.rb
def update
@milestone = Milestone.find(params[:id])
if @milestone.update_attributes(complete: true)
flash.now[:notice] = "You completed #{@milestone.title} for #{@milestone.points} points!"
respond_to do |format|
format.html { redirect_to current_user }
format.js { render :action => "milestones" }
end
else
redirect_to current_user
flash[:alert] = "Not working"
end
end
js milestones.js.erb
$('.user_points').html('<%= escape_javascript(render :partial => 'users/partials/user_points') %>');
模型 milestone.rb
before_update :add_user_points, if: :complete_changed?
private
def add_user_points
user = User.friendly.find(user_id)
user.update(points: user.points + self.points)
end
partial and view users / partials / _user_points.html.erb
<%= pluralize(@user.points, "point") %>
用户/ show.html.erb
<div class="user_points">
<%= render 'users/partials/user_points' %>
</div>
答案 0 :(得分:1)
好像你有一个与方法名称不匹配的ajax文件。在这里,您使用update
方法,但使用milestone.js.erb
文件。
你必须在这里更改几个部分。
<强>控制器强>
您必须编辑格式js。
def update
@milestone = Milestone.find(params[:id])
if @milestone.update_attributes(complete: true)
flash.now[:notice] = "You completed #{@milestone.title} for #{@milestone.points} points!"
respond_to do |format|
format.html { redirect_to current_user }
format.js
end
else
redirect_to current_user
flash[:alert] = "Not working"
end
end
然后,您必须将milestones.js.erb
更改为update.js.erb
。我希望这能帮到你。