使用Ajax& amp; Paginate多个模型PARAMS

时间:2016-12-14 14:04:40

标签: ruby-on-rails ruby ajax infinite-scroll kaminari

在我的应用中,我允许用户喜欢他们以后可以在他们的个人资料中查看的项目/封面对象。

我有一个配置文件模型,在单独的标签中显示项目列表和封面。 用户单击链接以选择要查看的列表,该列表将对象名称发送到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);
  }
});

} });

1 个答案:

答案 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

希望这有助于任何人!