2016-12-14 52 views
0

В моем приложении я разрешаю пользователям понравиться объект item/cover, который они могут позже просмотреть в своем профиле.Paginate несколько моделей с Ajax & Params

У меня есть модель профиля, которая показывает список предметов и обложек в отдельных вкладках. Пользователь нажимает на ссылку, чтобы выбрать, какой список нужно просмотреть, который отправляет имя объекта параметрам [: filter] и перезагружает страницу с правильным списком.

Теперь я пытаюсь создать бесконечный свиток для обоих списков с помощью Kaminari и ajax. Он отлично работает для каждого списка отдельно, но когда я пытаюсь использовать оператор if с параметрами (в профилях/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)}"); 

приложение/активы/JavaScripts/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

Поскольку если оператор нарушил вызов 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 

надеюсь, что это помогает любому!

 Смежные вопросы

  • Нет связанных вопросов^_^