Rails 3 / Kaminari / JQuery - кнопка «загрузить больше»: проблема с отображением результатов (загружается весь макет страницы, а не только частичный макет) - PullRequest
4 голосов
/ 05 апреля 2011

Начиная с ajax и jquery в сочетании с rails, я пытаюсь создать ссылку "load more" внизу моей страницы индекса пользователя. На моей странице индекса пользователя должны отображаться 10 первых пользователей, затем, нажав на ссылку, она загружает следующих 10 пользователей внизу пользовательского раздела и т. Д. Я использую Kaminari для нумерации страниц.

Я начал со следующего кода:

User_controller.rb

def index
  @users = User.page(params[:page]).per(10)
end

Пользователь / index.html.erb

<div id="users">
  <%= render :partial => @users %>
</div>
<%= link_to "Load more", "#", :class => "next" %>

_user.html.erb

<div id="box">
  <%= link_to full_name(user), user %>
</div>

application.js

Я нашел этот фрагмент (кредит: здесь ), пытаясь подогнать его под мои нужды:

function loadMore(pageNo) {
  var url = '/users?page=';
  $.get(url + pageNo, function(response) {
    $("#users").append(response);
  });
}

$(document).ready(function() {
  var currPage = 1;
  $("a.next").click(function() {
    loadMore(++currPage);
  });
});

Я отлично работаю, за исключением того, что загружает весь макет страницы со следующими результатами, а не только блок div в моем _user частичном Как я могу справиться с этим? Нужно ли было создавать index.js.erb (что-то вроде: page.insert_html: bottom,: users, :partal => @users, но в jquery, если так, как я могу это сделать)?

Спасибо за вашу помощь

Ответы [ 2 ]

9 голосов
/ 10 июля 2012

Вам не нужно создавать для него другое действие. Я бы использовал ненавязчивый JavaScript. Попробуйте что-то вроде этого:


User_controller.rb

вам не нужно ничего менять здесь, просто убедитесь, что контроллер реагирует на js

respond_to :html, :js

Пользователь / index.html.erb

<div id="users">
  <%= render :partial => @users %>
</div>
<%= link_to_next_page @users, 'Load More', :remote => true, :id=>"load_more_link" %>
<%###  link_to_next_page is a Kaminari function that returns exactly what the name implies %>

Пользователь / index.js.erb

$('#users').append("<%= escape_javascript(render :partial => @users)%>");
$('#load_more_link').replaceWith("<%= escape_javascript(link_to_next_page(@users, 'Load More', :remote => true, :id=>'load_more_link'))%>");

Это должно быть все, что нужно, чтобы это заработало. Конечно, вы можете добавить JavaScript, чтобы вставить значок загрузки при нажатии на ссылку или что-то еще. Примечание: я не тестировал эту точную реализацию, поэтому могут быть некоторые ошибки, но вы должны быть в состоянии понять идею

3 голосов
/ 05 апреля 2011

Для этого вы должны создать собственное действие, связанное с его собственным представлением.Затем обязательно отключите рендеринг макета:

def more_users
  @users = User.page(params[:page]).per(10)
  render :layout => false
end
...