用户根据他们完成的里程碑数量获得积分。我有一个用户使用 Ajax 完成的里程碑列表,并且里程碑点应该添加到用户的点上。
数据库正确更新并正确刷新页面更新,但是在 Ajax 调用后渲染部分内容却没有。
我假设这与 before_update
回调有关,但我无法弄清楚。
Controller 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
部分和 View users/partials/_user_points.html.erb
<%= pluralize(@user.points, "point") %>
users/show.html.erb
<div class="user_points">
<%= render 'users/partials/user_points' %>
</div>
最佳答案
您的 ajax 文件似乎与方法名称不匹配。在这里,您有 update
方法,但使用 milestone.js.erb
文件。
您必须更改此处的几个部分。
Controller
你必须编辑你的格式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
。我希望这对您有帮助。
关于javascript - before_update 无法与 Ajax、Rails 4 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621393/