这个看似简单的问题让我发疯。我正在关注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 %>
在此页面上显示“正在加载更多产品”,但它实际上从未加载过更多产品。
答案 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