我有这个有活动的小应用程序。在我的事件索引视图中,我遍历所有事件并显示一些数据。在each
循环内部,我有一个指向' Upvote'特定事件,这是一个ajax请求。由于某些原因,我的观点不会立即更新,但是当我点击“Upvote”时会更新。再次。
以下是我向' Upvote'
的链接<div id="upvote_link_<%= event.id%>">
<%= link_to('Upvote', upvote_event_path(event), method: :post, remote: true)%>
</div>
这是我的upvote
方法,我在其中增加votes
字段。
def upvote
@event = Event.find(params[:id])
Event.increment_counter(:votes, @event.id)
respond_to do |format|
format.js
end
end
接下来是我的upvote.js.erb
,其中我用新值替换旧的votes
值。
$('#upvotes_<%= @event.id %>').html("<%= escape_javascript (render 'upvote', event: @event )%>");
接下来是我的_upvote.html.erb
部分替换旧的votes
值。
<span style="font-family:MetaSerifOT-Book;font-size:13px;">
<%= pluralize(event.votes, "vote") %>
</span>
问题是当我点击“Upvote”时。链接我的请求通过,我的活动模型中的votes
字段得到更新,但视图不会更新,直到我再次点击Upvote
。我不确定发生了什么。有什么想法或建议吗?
更新
这是我设置id的地方:upvotes_<%= event.id %>
我已将Votes
计数隔离在一个部分内。
<div id="upvotes_<%= event.id%>">
<%= render 'upvote', event: event %>
</div>
答案 0 :(得分:2)
问题出在控制器代码中。我认为@event对象没有重新加载。一种解决方案是您必须在视图中重新加载@event对象,如
$('#upvotes_<%= @event.id %>').html("<%= escape_javascript (render 'upvote', event: @event.reload )%>");
。
答案 1 :(得分:0)
要添加到Santanu
的答案,您需要查看方法的代码:
#app/controllers/events_controller.rb
class EventsController < ApplicationController
respond_to :js, only: :upvote #-> if you have the responders gem
def upvote
@event = Event.find params[:id]
@event.increment! :votes
respond_with @event
end
end