我有一个我使用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 %>
答案 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
,但在控制器操作中执行此操作。将实例变量传递给视图时,应该可以使用它,而无需其他查询。最好将所有查询和逻辑保留在控制器和模型中,不要将它们混合到视图中。