Как указать контроллер и действие для разбивки Ajax на страницы с помощью Kaminari?

#ajax #ruby-on-rails-3 #kaminari

#ajax #ruby-on-rails-3 #kaminari

Вопрос:

Я использую камень Kaminari для своего приложения ruby on rails (для тех, кто все еще использует will_paginate, я бы рекомендовал рассмотреть возможность переключения! Намного чище и универсальнее).

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу указать действие контроллера при выполнении разбивки на страницы AJAX, т.Е.. как таковой, заставьте мою разбивку на страницы работать удаленно:

  <%= paginate @feeds, :param_name => :page, :remote => true%>
  

По умолчанию, когда я устанавливаю:remote => true и добавляю следующие строки в файл home.js.erb контроллера «страницы», он работает на моей домашней странице. Мне даже не нужно указывать, на какую часть js ссылаться; он выбирает автоматически.

   $('.synopsis').html('<%= escape_javascript render('exchanges/synopsis', :feeds => @feeds)%>');
  $('.paginator').html('<%= escape_javascript(paginate(@feeds, :param_name => :page, :remote => true).to_s)%>')
  

НО загвоздка в том, что этот раздел «синопсис» является частичным, который я отображаю на множестве разных страниц в моем приложении. Итак, на страницах, где контроллер не является моим контроллером «pages», удаленная разбивка на страницы больше не работает.

Одним из решений было бы добавить эти две строки в файлы js.erb во многих моих разных контроллерах. Но это было бы излишним и неэлегантным.

Я бы предпочел иметь возможность указывать в вызове «разбиение на страницы», какой контроллер и какое действие использовать для удаленного вызова. Тогда я думаю, что я бы написал действие типа:

  def paginate_remotely
     respond_to paginate_remotely.js
 end
  

Как я смогу это сделать? Кажется, это такой простой вопрос, но я не смог его решить. Следующее, конечно, не работает:

  <%= paginate @feed_exchanges, :param_name => :exchange_page, :remote => true, :controller => :exchanges, :action => :paginate_remotely %>
  

Ответ №1:

Для тех, кто заинтересован, ответ заключается в том, что вы должны указать контроллер и действие в спецификации :params следующим образом:

  <%= paginate @feed_exchanges, :params => {:controller => :exchanges, :action => :paginate_remotely}, :param_name => :exchange_page, :remote => true %>
  

Не забудьте написать define the route для этого действия в config/routes.rb и создать частичную часть js, в моем случае называемую paginate_remotely.js.erb, содержащую:

  $('.synopsis').html('<%= escape_javascript render('exchanges/synopsis', :feeds => @feeds)%>');
 $('.paginator').html('<%= escape_javascript(paginate(@feeds, :param_name => :page, :remote => true).to_s)%>')