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

时间:2015-02-15 19:03:09

标签: javascript jquery ruby-on-rails ajax instance-variables

我对模型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') %>");

4 个答案:

答案 0 :(得分:4)

我将使用hamlcoffee-script

在呈现comments时,您将html5 data attributeid的{​​{1}}放在一起:

comment

评论部分

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

application.coffee

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

comments_controller

$ ->
  $("#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

评论/ view_more.js.erb

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-wrapper").append("<%= escape_javascript(render @comments) %>"); 作为数据属性

答案 1 :(得分:4)

我会使用已经实现的分页宝石kaminariwill_paginate。我将使用will_paginate创建此示例。

首先,重要的是要说您的方法不正确,因为会加载所有评论每个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) %>')

答案 2 :(得分:0)

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

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

在评论部分的开头添加隐藏字段,默认值为&#34; 0&#34;

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

希望它会有所帮助

答案 3 :(得分:0)

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

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