Лучший способ заставить will_paginate работать с Ajax - PullRequest
8 голосов
/ 19 февраля 2009

Если вы используете Google "will_paginate" и "ajax", лучшим результатом будет это сообщение в блоге : Но оригинальный автор will_paginate говорит, что не используйте этот метод (плохо для SEO / пауки) ...

Но я не могу заставить работать оригинальный метод авторов (его javascript убивает все мои ссылки). Другой джентльмен предлагает метод, подобный концепции Мислава (первоначального автора will_paginate). Но я не могу заставить что работать.

так .... что является лучшим способом разбить на страницы с помощью AJAX и оставаться SEO-дружественным? (для рельсов> 2,1)

Ответы [ 5 ]

15 голосов
/ 20 февраля 2009

Том отвечает правильно. Просто ради шуток я прототипировал быструю реализацию. Вот скринкаст , который показывает его использование Ajax, когда Javascript включен (ваши пользователи), и все еще имеет красивые URL, когда Javascript отключен (Google). И вот несколько фрагментов кода, которые помогут вам в этом.

config/routes.rb:

map.connect 'items/:page', :controller => "items", :action => "index", :page => 1

app/controllers/items_controller.rb:

class ItemsController < ApplicationController
  def index
    @items = Item.paginate(:all, :page => params[:page])

    respond_to do |format|
      format.html
      format.js do
        render :update do |page|
          page.replace_html :items, :partial => "items"
          page << "ajaxifyPagination();"
        end
      end
    end
  end
end

app/views/items/index.html.erb:

<h1>Listing items</h1>

<div id="items">
  <%= render :partial => "items" %>
</div>

app/views/items/_items.html.erb:

<%= will_paginate @items %>

<table>
  <% for item in @items %>
    <tr>
      <td><%= item.id %></td>
    </tr>
  <% end %>
</table>

расположение:

<%= javascript_include_tag :defaults %>

public/javascripts/application.js:

$(document).ready(function() {
    ajaxifyPagination();
});

function ajaxifyPagination() {
    $(".pagination a").click(function() {
        $.ajax({
          type: "GET",
          url: $(this).attr("href"),
          dataType: "script"
        });
        return false;
    });
}

В моем примере используется jQuery (с jRails ), но с Prototype это также просто.

7 голосов
/ 19 февраля 2009

SEO дружественный и ненавязчивый JavaScript идет рука об руку. Что вы можете сделать, это следующее.

  • Кодировать весь сайт, как будто включен только html (включая нумерацию страниц)
  • Используйте response_to и обслуживать только список элементов, если запрос поступил от js
  • Используя onDomReady из любой выбранной вами библиотеки, вы пытаетесь перехватить все ссылки на страницы и добавить событие onclick, которое инициирует вызов ajax для этого нового представления и возвращает результат. Вы помещаете этот результат в контейнер, содержащий данные, которые вы разбиваете на страницы. Затем щелчок мышью возвращает false.
  • Чтобы повысить удобство работы пользователей, вы можете добавить некоторые функции, такие как активные ссылки и т. Д., К тому же методу javascript.

Используя этот подход, нумерация страниц будет работать для JS и не-js, поскольку пользователи, не являющиеся js (включая Googlebot), будут проходить вашу пагинацию в обычном режиме. Только в том случае, если у пользователя включен JavaScript, контейнер с данными будет обновляться с новыми результатами.

1 голос
/ 19 февраля 2009

К сожалению, я не думаю, что вы можете использовать Ajax так, как вам хочется, и при этом оставаться SEO-дружественным в отношении постраничного контента. Проблема в том, что роботы Google и друзья, насколько мне известно, не будут просматривать ваш контент с помощью запросов XHR, поэтому они просто не увидят этот контент.

Тем не менее, если у каждого элемента, разбитого на страницы, есть свои статические, оптимизированные для SEO страницы (или иным образом статически доступные на вашем сайте), контент все равно попадет в их движки. Это путь, которым вы, вероятно, захотите пойти.

0 голосов
/ 25 апреля 2013

Есть отличный способ сделать это легко, если не беспокоиться о пауках. У меня ушло 5 минут. Проверить:

https://github.com/ronalchn/ajax_pagination/wiki/Adding-AJAX-to-will_paginate

Если вы получили сообщение об ошибке в отсутствующем файле 'history', установите:

https://github.com/wweidendorf/jquery-historyjs

но также следует помнить:

rails ajax_pagination не может найти файл 'history'

0 голосов
/ 19 апреля 2013

На эту тему есть рейлкасты, которые мне помогли http://railscasts.com/episodes/174-pagination-with-ajax

Я использую rails 3.2, поэтому я добавил упомянутый pagination.js в папку app / assets / javascripts

pagination.js

 $(function() {
    $(".pagination a").live("click", function() {
        $(".pagination").html("Loading...");
        $.getScript(this.href);
        return false;
    });
});

А потом создал

home.js.erb

$('#div_tags_list').html('<%= escape_javascript(render partial: '/customersb2b/user_customer_numbers_list').html_safe %>')
$('#receipts_list').html('<%= escape_javascript(render partial: '/customersb2b/feed').html_safe %>')

Поскольку у меня есть две разные записи на моей домашней странице.

Это все, что мне нужно было сделать, чтобы will_paginate работал с Ajax. Что касается проблем SEO, ну, я не знаю много об этом, но URL http://localhost:3000/customers?_=1366372168315&feed_page=1&tags_page=2 все еще работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...