带有 ajax 远程 true 的 Rails link_to 不更新视图
Rails link_to with ajax remote true not updating view
我有一个有事件的小应用程序。在事件的索引视图中,我循环访问所有事件并显示一些数据。在each
循环中,我有一个指向特定事件的"Upvote"链接,这是一个 ajax 请求。由于某些原因,我的观点不会立即更新,但当我再次单击"点赞"时会更新。
这是我的"赞成"链接
<div id="upvote_link_<%= event.id%>">
<%= link_to('Upvote', upvote_event_path(event), method: :post, remote: true)%>
</div>
这是我递增votes
字段的upvote
方法。
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>
问题是当我单击我的请求通过的"赞成"链接时,我的事件模型中的votes
字段会更新,但在我再次单击Upvote
之前视图不会更新。我不确定发生了什么。有什么想法或建议吗?
更新这是我设置 id 的地方:upvotes_<%= event.id %>
我已经将Votes
计数隔离在部分内。
<div id="upvotes_<%= event.id%>">
<%= render 'upvote', event: event %>
</div>
问题出在控制器代码中。我认为@event对象没有被重新加载。一种解决方案是您必须在视图中重新加载@event对象,例如
$('#upvotes_<%= @event.id %>').html("<%= escape_javascript (render 'upvote', event: @event.reload )%>");
.
要添加到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
increment!
相关文章:
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- Angular:更新一次性绑定的数据
- Javascript更新孙窗口中的表单元素
- 使用AngularJS中的筛选器更新给定的表
- 从选项页面更新chrome扩展清单权限
- 如何在不刷新页面的情况下更新显示框
- 延期承诺值未更新/解析/延期
- 标记的实时更新,无需加载页面谷歌地图API V3
- 使用mongodb更新中的一个变量
- 访问jsrender模板中的全局javascript变量并更新它