Rails link_to与ajax远程true不更新​​视图

时间:2016-01-22 07:16:38

标签: javascript jquery html ruby-on-rails ajax

我有这个有活动的小应用程序。在我的事件索引视图中,我遍历所有事件并显示一些数据。在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>

2 个答案:

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

increment!