无限滚动仅适用于1页

时间:2014-08-29 02:31:52

标签: ruby-on-rails

这个看似简单的问题让我发疯。我正在关注this railscast以实现无休止的滚动,但我只能让它在我的帖子索引页面上工作。在任何其他页面上执行此操作都不起作用。

我将从 工作的页面开始。

posts_controller.rb

def index
@posts = Post.order("created_at desc").page(params[:page]).per_page(10)
end

文章/ index.html.erb

<div id="products">
<%= render 'posts/post' %>
</div>

<%= will_paginate @posts %>  

文章/ _index.html.erb

<% @posts.each do |post| %>
<%= post.title %>
<% end %>

index.js.erb的

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

最后,posts.js.coffee

  jQuery ->
    if $('.pagination').length
      $(window).scroll ->
        url = $('.pagination .next_page').attr('href')
        if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50
          $('.pagination').text("Fetching more products...")
          $.getScript(url)
      $(window).scroll()

现在没有工作的页面。

首先,我在users.js.coffee中使用相同的jquery。

users_controller.rb

def allusers
@users = User.order("created_at desc").page(params[:page]).per_page(10)    
end

用户/ allusers.html.erb

<div id="products">
<%= render 'users/allusers' %>
</div>

<%= will_paginate @users %>

用户/ _allusers.html.erb

<%= @users.each do |user| %>
<%= user.name %>
<% end %>

用户/ allusers.js.erb

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

在此页面上显示“正在加载更多产品”,但它实际上从未加载过更多产品。

1 个答案:

答案 0 :(得分:0)

资产管道

我能看到的最重要的问题是您使用erb文件调用allusers.js.erb代码。

你没有提到这个文件存储的位置 - 所以我假设它在app/assets/javascripts目录中(这意味着它是asset pipeline的一部分)

-

您遇到的问题是,如果您在资产管道中使用文件,则无法使其动态。它必须是&#34;静态&#34;,因此当您将应用程序推向生产时它可以是precompiled

具体来说,当您调用以下方法时:

`append('<%= j render(@users) %>');`

现在,正确地看一下,我猜你实际上已经从控制器响应/视图区域加载了这个,所以我在这里详细说明如何做到这一点:

-

<强>动态

当然,如果您的文件是从控制器中的format.js回调调用的结果,那么事情会有所不同。我将详细说明我在这里做的事情:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def index
       respond_to do |format|
          format.js #-> will call /app/views/users/index.js.erb
       end
   end
end

我认为您的问题是,您正在调用partial文件.js.erb的名称(allusers.js.erb)。这不起作用,因为您在控制器中使用的action 不是 allusers,但index

您必须记住,当您为Rails应用程序访问route时,它将加载控制器操作。这非常重要,因为它完全独立于您的partials

所以我建议您将allusers.js.erb重命名为您正在访问的操作,我认为 index.js.erb