带有 ajax 远程 true 的 Rails link_to 不更新视图

Rails link_to with ajax remote true not updating view

本文关键字:to 更新 新视图 link Rails ajax 远程 true 带有      更新时间:2023-09-26

我有一个有事件的小应用程序。在事件的索引视图中,我循环访问所有事件并显示一些数据。在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!