有人可以帮我解决如何更新我的视图,保留所有现有的ajax和will_paginate功能。
我有一个页面rehome.html.erb
<div id="options">Option Select Here</>
<div class="all_animals">
<%= render @animals %>
</div>
<% unless @animals.current_page == @animals.total_pages %>
<div id="infinite-scrolling">
<%= will_paginate @animals %>
</div>
<% end %>
// WILL_PAGINATE
<script type="text/javascript">
$(function(){
if($('#infinite-scrolling').size() > 0) {
$(window).on('scroll', function(){
//Bail out right away if we're busy loading the next chunk
if(window.pagination_loading){
return;
}
more_url = $('.pagination a.next_page').attr('href');
if(more_url && $(window).scrollTop() > $(document).height() - $(window).height() - 50){
//Make a note that we're busy loading the next chunk.
window.pagination_loading = true;
$('.pagination').text('Loading.....');
$.getScript(more_url).always(function(){
window.pagination_loading = false;
});
}
});
}
});
</script>
这将加载所有@animals集合,将其分页为每页6个,当我向下滚动页面时,另外6个被加载等等。
相应的控制器
class PublicController < ApplicationController
before_filter :default_animal, only: [:rehome]
def rehome
respond_to do |format|
format.html
format.js
end
end
private
def default_animal
@animals = Animal.animals_rehome.paginate(:page => params[:page], :per_page => 6)
end
end
rehome.js.erb
$('.all_animals').append('<%= j render @animals %>');
<% if @animals.next_page %>
$('.pagination').replaceWith('<%= j will_paginate @animals %>');
<% else %>
$(window).off('scroll');
$('.pagination').remove();
<% end %>
因此,当从下拉列表中选择一个选项时,会创建一个ajax帖子来创建一个新的查询,该查询将返回一个新的@animals集合
$.ajax({
type: 'POST',
url: '/public/rehomed',
data: data_send,
success: function(data) {
//console.log(data);
}
});
控制器
def rehomed
# conditions logic
@animals = Animal.joins(:user).where(conditions).paginate(:page => params[:page], :per_page => 6)
respond_to do |format|
format.js {render json: @animals }
end
end
我想要做的是加载新的集合(再次分页为6页),当我向下滚动时只显示属于新的@animals集合的对象(如果有的话)
目前,分页链接未更新,因为当我向下滚动页面时,原始集合已加载
由于
修改
所以我创建了一个rehomed.js.erb
文件,与我的rehome.js.erb
$('.all_animals').empty();
$('.all_animals').append('<%= j render @animals %>');
<% if @animals.next_page %>
$('.pagination').replaceWith('<%= j will_paginate @animals %>');
<% else %>
$(window).off('scroll');
$('.pagination').remove();
<% end %>
并且在我的重新行动中
respond_to do |format|
format.js
end
因此加载了新的动物集合,重新创建了分页链接,但使用了重新创建的URL,例如
<a class="next_page" href="/public/rehome?page=2" rel="next">Next →</a>
<a class="next_page" href="/public/rehomed?page=2" rel="next">Next →</a>
因此,当我向下滚动时,我得到以下内容,因为链接不存在且getScript失败
$('.pagination').text('Loading.....');
编辑2
我已经实现了@japed的答案,但现在在渲染新集合后,分页将继续渲染数据库的整个集合,包括重复为新集合选择的集合,重复自身
如何确保为我的链接生成正确的网址?
答案 0 :(得分:2)
paginate是否允许您设置params哈希,以便您可以将其更改为使用其他控制器操作,如下所示:
will_paginate(@animals, :params => { :controller => "public", :action => "rehomed" })