Rails link_to与ajax远程真正不更新视图

问题描述:

我有这个小事件的应用程序。在我的事件索引视图中,遍历所有事件并显示一些数据。在each循环内部,我有一个“Upvote”特定事件的链接,这是一个ajax请求。由于某些原因,我的视图不会马上更新,而是在再次单击“Upvote”时更新。Rails link_to与ajax远程真正不更新视图

这里是我的链接“给予好评”

<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> 

问题是,当我点击了“给予好评”链接我的请求经过和votes场在我的事件模型被更新,但鉴于不会更新,直到我再次点击Upvote。我不确定发生了什么事。任何想法或建议?

更新 这是我设置的ID:upvotes_<%= event.id %>我已经分离出里面的部分的Votes计数。

<div id="upvotes_<%= event.id%>"> 
      <%= render 'upvote', event: event %> 
    </div> 
+0

@rob我已经更新的问题,以显示在哪里设置ID:'upvotes_ ' –

问题出在控制器代码中。我认为@event对象没有被重新加载。一种解决方案是,您必须在像

$('#upvotes_<%= @event.id %>').html("<%= escape_javascript (render 'upvote', event: @event.reload)%>");这样的视图中重新加载@event对象。

+2

嘿Santanu解决了这个问题。非常感谢。我还没有看到一个用户需要重新加载的例子。再次感谢。 –

+0

谢谢Elvyn Mejia,我的答案是PLZ票。 – Santanu

+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 

increment!