在我的应用中,我允许用户喜欢他们以后可以在他们的个人资料中查看的项目/封面对象。
我有一个配置文件模型,在单独的标签中显示项目列表和封面。 用户单击链接以选择要查看的列表,该列表将对象名称发送到params [:filter]并使用正确的列表重新加载页面。
我现在正尝试使用Kaminari和ajax为这两个列表创建无限滚动。它对每个列表分别正常工作,但是当我尝试使用带有params的if语句时(在profiles / show.js.haml中),加载会中断。 有什么想法吗?
profiles_controller.rb
class ProfilesController < ApplicationController
def show
@covers = @user.get_voted(Cover).page(params[:page])
@items = @user.get_voted(Item).page(params[:page])
respond_to :html, :js
end
end
简档/ show.html.haml
.menu
= link_to 'Covers', profile_path(filter: "covers")
= link_to 'Items', profile_path(filter: "items")
.objects
= render 'profiles/covers' if !params[:filter] || params[:filter] == "covers"
= render 'profiles/items' if params[:filter] == "items"
简档/ _covers.rb
- if @covers.any?
.covers= render @covers
.pagination= link_to_next_page @covers, 'View More', params: params, remote: true
- else
= "No covers yet..."
简档/ _items.rb
- if @items.any?
.items= render @items
.pagination= link_to_next_page @items, 'View More', params: params, remote: true
- else
= "No items yet..."
简档/ show.js.haml
- if !params[:filter] || params[:filter] == "covers"
$('.covers').append("#{j render @covers}");
- if @covers.last_page?
$('.pagination').remove();
- else
$('.pagination').html("#{j link_to_next_page(@covers,'View More', params: params, remote: true)}");
- if params[:filter] == "items"
$('.items').append("#{j render @items}");
- if @items.last_page?
$('.pagination').remove();
- else
$('.pagination').html("#{j link_to_next_page(@items,'View More', params: params, remote: true)}");
应用/资产/ Javascript角/ pagination.js
$(function() {
if ($('.pagination').size() > 0) {
$(window).on('scroll', function() {
var next_page_url = $('.pagination a[rel=next]').attr('href');
if (next_page_url && $(window).scrollTop() > $(document).height() - $(window).height() - 200) {
$('.pagination').html('<img src="/assets/ajax-loader.gif" alt="Loading..."/>');
$.getScript(next_page_url);
}
});
} });
答案 0 :(得分:1)
由于if语句中断了ajax调用,我不得不解决它:
我将_covers.html.haml和_items.html.haml合并为一个部分_models.html.haml:
- if @models.any?
.models= render @models
.pagination= link_to_next_page @models, 'View More', params: params, remote: true
- else
.text-center= "Nothing yet..."
并处理控制器中的条件:
def show
if !params[:filter] || params[:filter] == "covers"
@models = @user.get_voted(Cover).page(params[:page])
elsif params[:filter] == "items"
@models = @user.get_voted(Item).page(params[:page])
end
respond_to :html, :js
end
希望这有助于任何人!