无限滚动轨道ajax请求触发,但不显示下一个分页页面

时间:2015-12-29 16:18:34

标签: jquery ruby-on-rails ajax infinite-scroll will-paginate

我有一个我使用will_paginate的rails应用程序。然后我使用will_paginate作为无限滚动的基础。经过大量的试验和错误后,请求似乎正在运行,但是请求不是在应用程序中呈现下一页内容,而是重新呈现我的所有内容并再次以分页形式显示它。我有一个想法,就是我的部分我的.each迭代器,但我不确定。

下面是我的部分,控制器,js.erb,coffescript和日志。如果有人可以帮助解释为什么这种方法不能正常工作,我将非常感激!

日志:您可以看到它正在进入下一页,并且每个请求的所有5个页面都会这样做:

Started GET "/links?page=2&_=1451404304001" for ::1 at 2015-12-29 10:51:46 -0500
Processing by LinksController#index as JS
  Parameters: {"page"=>"2", "_"=>"1451404304001"}
  Link Load (0.2ms)  SELECT  "links".* FROM "links" LIMIT 5 OFFSET 5
   (0.1ms)  SELECT COUNT(*) FROM "links"
  Link Load (0.2ms)  SELECT  "links".* FROM "links"  ORDER BY "links"."cached_votes_score" DESC LIMIT 5 OFFSET 5
  CACHE (0.0ms)  SELECT COUNT(*) FROM "links"

_link.html.erb:

    <!-- order links based on total number of votes -->

  <div class="link row clearfix">
    <h2>

    </h2>
    <h2>
      <%= link_to link.title, link %><br>
    </h2>
    <p>
      <%= link_to link.url, link %><br>
    </p>

<!-- acts_as_votable for like_link -->
    <div class="btn-group">
        <%= link_to like_link_path(link), method: :put, class: "btn btn-default btn-sm" do %>
          <span class="glyphicon glyphicon-chevron-up"></span>
          Upvote
          <%= link.get_upvotes.size %>
        <% end %>
        <%= link_to dislike_link_path(link), method: :put, class: "btn btn-default btn-sm" do %>
          <span class="glyphicon glyphicon-chevron-down">
          Downvote
          <%= link.get_downvotes.size %>
        <% end %>
    </div>
  </div>

index.js.erb的:

$('#links').append('<%= j render(@links) %>');
<% if @links.next_page %>
  $('.pagination').replaceWith('<%= j will_paginate @links.next_page %>');
<% else %>
  $('.pagination').remove();
<% end %>

link.js.coffee:

jQuery ->
        $(window).scroll ->
            if $(window).scrollTop() > $(document).height() - $(window).height() - 50
                    $.getScript($('.pagination a.next_page').attr('href'))

links_controller.rb index action:

class LinksController < ApplicationController
  before_filter :authenticate_user!, except: [:index, :show]

  def index
    @links = Link.order(cached_votes_score: :desc).paginate(page: params[:page], per_page: 5)

    respond_to do |format| 
      format.js
      format.html
    end
  end
end

index.html.erb:

<div class = "sort_paginate_ajax"><%= render @links %></div>

<div id="quotes_links">
  <%= will_paginate @links %>
</div>

当我将index.js.erb更改为Miles在第一条评论中建议的更改时,我现在得到以下未定义的方法错误:

ActionView::Template::Error (undefined method `total_pages' for 3:Fixnum):
    1: $('#links').append('<%= j render(@links) %>');
    2: <% if @links.next_page %>
    3:   $('.pagination').replaceWith('<%= j will_paginate @links.next_page %>');
    4: <% else %>
    5:   $('.pagination').remove();
    6: <% end %>

1 个答案:

答案 0 :(得分:0)

<% @links.order(cached_votes_score: :desc).each do |link| %>

您不需要这样做,因为您正在渲染一组ActiveRecord模型:

$('#links').append('<%= j render(@links) %>');

Rails将遍历链接并为每个链接呈现app/links/_link.html.erb部分。因此,此部分应仅包含显示一个不同链接的HTML。您可以在其中使用link变量。

还尝试不在视图中使用order,但在控制器操作中执行此操作。将实例变量传递给视图时,应该可以使用它,而无需其他查询。最好将所有查询和逻辑保留在控制器和模型中,不要将它们混合到视图中。