#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)%>')