如何使用每个ajax请求更新实例变量

How can I update an instance variable with each ajax request?

本文关键字:更新 实例 变量 请求 ajax 何使用      更新时间:2023-11-22

我对模型Page的视图有一长串注释。我尝试创建一个"查看更多"按钮来显示接下来的十条评论,而不是在页面加载时显示所有评论。该按钮向控制器发送一个ajax请求,然后控制器使用jquery:呈现该块

_view_more.html.erb

<% comments.each_with_index do |comment, index|%>
  <% if (( index > @start_number) && (index < @end_number) ) %>
  <%= comment.text %>
<% end %>

比方说,我总是想展示接下来的10条评论。我只想设置@start_number = @start_number + 10@end_number = @end_number + 10在控制器中,但实例变量被重置,因此@start_number将为零。如何设置一个在每次ajax请求时增加10的变量?

"查看更多"按钮

<%= link_to "view more", view_more_page_path, remote: true %>

pages_controller.rb

def view_more
  @page = Page.find(params[:id])
  respond_to do |format|
    format.html { redirect_to root_path }
    format.js
  end
end

view_more

$("#comments-body").append("<%= escape_javascript(render 'view_more') %>");

我将使用hamlcoffee-script

渲染comments时,将html5 data attributecomment:的id放在一起

#view where to render comments
%div#comments-wrapper{:"data-pageid" => @page.id}
  =render @comments
=link_to "View more", "#", id: "view-more-link"

评论部分

#comments/_comment.html.haml
%p.single-comment{:"data-commentid" => comment.id}
  =comment.body

application.coffee

$ ->
  $("#view-more-link").on 'click', ->
    last_comment_id = $("#comments-wrapper .single-comment").last().data('commentid')
    page_id = $("#comments-wrapper").data("pageid")
    $.ajax
      url: "/comments/view_more"
      dataType: "script"
      data:
        last_comment_id: last_comment_id
        page_id: page_id

注释_控制器

def view_more
  @page = Page.find(params[:pageid])
  if params[:last_comment_id]
    @comments = @page.comments.where("comments.id > ?", params[:last_comment_id]).limit(10)
  end
  respond_to do |format|
    format.js
  end
end

comments/view_more.js.erb

$("#comments-wrapper").append("<%= escape_javascript(render @comments) %>");

注意:我不知道你的路线是如何设置的,所以我把page.id作为数据属性以及

我会使用已经实现的分页宝石kaminari或will_pagenate。我将使用will_page创建这个示例。

首先,必须指出您的方法是不正确的,因为它会在每个view_more请求中加载所有注释。如果你想显示10条评论,那么从数据库中只选择它们是有意义的,对吧?分页宝石会为你做的!

让我们来看看代码:

"查看更多"按钮

<%= link_to "view more", view_more_page_path, remote: true, id: 'view-more-btn' %>

pages_controller.rb

def view_more
  @comments = Page.find(params[:id]).comments.paginate(page: params[:page], per_page: 10)
  respond_to do |format|
    format.html { redirect_to root_path }
    format.js
  end
end

_view_more.html.erb

<% @comments.each do |comment| %>
  <%= comment.text %>
<% end %>

view_more.js.erb

$("#comments-wrapper").append("<%= escape_javascript(render 'view_more') %>");
# We need to update the 'view more' link with the next page number
$('#view-more-btn').attr('href', '<%= view_more_page_path((params[:page] || 0) + 1) %>')

在使用count..进行ajax调用之前更新隐藏变量不是很好吗。。?

var currentVal = parseInt($("[type=hidden]").val());
$("[type=hidden]").val( currentVal + 1 );

在注释部分的开头添加隐藏字段,默认值为"0"

<input type="hidden" name="hiddenId" id="hiddenId" value="0">

希望它能帮助

如果您想要一种快速而肮脏的方法,可以将start_number和end_number保存在cookie中。

但是,跟踪客户端下一步需要呈现的内容是正确的做法