2009-02-19 9 views
8

Jeśli google „will_paginate” i „Ajax”, górny wynik jest this blog post: Ale oryginalny autor will_paginate mówi not use this method (złe dla SEO/pająki) ...Najlepszy sposób, aby dostać will_paginate pracy z Ajax

Ale nie mogę uzyskać oryginalnej metody autorów do pracy (jego javascript zabija wszystkie moje linki). An other gentleman sugeruje podobną metodę do koncepcji mislav's (oryginalna wola_pogubić autora). Ale nie mogę uzyskać , która zadziała.

tak ... co jest jest najlepszy sposób na paginację za pomocą AJAX, i zachować SEO friendly? (dla RAILS> 2.1)

+0

W rzeczywistości to pytanie jest teraz pierwszym ogniwem; – ted

Odpowiedz

1

Niestety, nie sądzę, że możesz używać Ajaxu w sposób, w jaki chcesz, i nadal pozostać przyjaznym dla SEO, jeśli chodzi o stronę z paginacją. Problem polega na tym, że roboty Google i znajomych, o ile mi wiadomo, nie przejdą przez twoje treści za pomocą żądań XHR, więc po prostu nie zobaczą tych treści.

To powiedziawszy, jeśli strony z numeracją stron mają własne statyczne, przyjazne dla SEO strony (lub w inny sposób są statycznie dostępne w Twojej witrynie), treść nadal będzie trafiać do ich silników. W ten sposób prawdopodobnie będziesz chciał iść.

7

Przyjazny Seo i dyskretny javascript idzie w parze. Co możesz zrobić, to:

  • Kod cała strona jakby tylko HTML jest włączony (zał swoją paginacji rzecz)
  • Używaj respond_to i służą jedynie listę elementów, czy żądanie pochodzi z js
  • Korzystanie onDomReady z jakiejkolwiek biblioteki ty wybierz próbę złapania wszystkich linków do stronicowania i dodaj zdarzenie onclick, które wyzwala wywołanie ajaxa do tego nowego widoku i zwraca wynik. Wynik ten umieszczasz w kontenerze zawierającym dane, które chcesz paginować. Onclick następnie zwraca wartość false.
  • Aby zapewnić użytkownikom lepszą obsługę, możesz dodać niektóre funkcje, takie jak aktywne linki itp. Do tej samej metody javascript.

Stosując to podejście, paginacja będzie działać dla JS i non-js, ponieważ użytkownicy spoza js (w tym Googlebot) będą przemierzać twoją paginację w normalny sposób. Tylko w przypadku, gdy użytkownik ma włączony javascript, kontener z danymi zostanie zaktualizowany o nowe wyniki.

+0

"Utwórz widok i oznacz trasę do niego." powinno być: użyj reply_to i wyświetl tylko listę elementów, jeśli żądanie pochodzi z js. –

+0

Dzięki zmieniono odpowiedź – TomHastjarjanto

15

Odpowiedź Tomha jest prawidłowa. Tylko dla shiggles, prototypowałem szybką implementację. Here's a screencast, który pokazuje to za pomocą Ajax, gdy JavaScript jest włączony (twoi użytkownicy) i nadal ma ładne adresy URL, gdy JavaScript jest wyłączony (Google). Oto kilka fragmentów kodu, które pozwolą Ci je przetasować.

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> 

układ:

<%= 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; 
    }); 
} 

Mój przykład używa jQuery (z jRails), ale jest to proste do zrobienia z Prototype, jak również.

+3

+1 za "shiggle" - każdego dnia możesz uczyć się nowej terminologii. Dobra odpowiedź też. – DanSingerman

+0

Cześć Ian Próbowałem zaimplementować ten kod. Mam 2 pytania. 1. map.connect "items /: page",: controller => "items",: action => "index",: page => 1 rzuca mi błąd z informacją "undefined variable map".Jeszcze jeden błąd, mam widok indeksu, który renderuje częściowy _browser, który z kolei renderuje częściową _listing, która jest opakowana w div zwany "updated_ics_per_table". Używam $ ("# update_ics_per_table" .pagination a ") .Nie wchodzi ona w tę funkcję. Proszę pomóż mi tutaj – ramya

+0

@ramya: Odpowiedź Iana jest specyficzna dla Rails 2 i część kodu od tego czasu został przestarzały w Railsach 3+. – James

0
Nie

JEST railscasts na ten temat, który mi pomógł http://railscasts.com/episodes/174-pagination-with-ajax

biegnę szyny 3.2, więc dodałem pagination.js tam wymienione do aplikacji/aktywa/javascripts folderu

pagination.js

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

A potem stworzył

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

Ponieważ mam dwie różne oferty na mojej stronie głównej.

To wszystko, co musiałem zrobić, aby umieścić will_paginate we współpracy z Ajax. Co do problemów związanych z SEO, cóż, nie wiem zbyt wiele na ten temat, ale URL http://localhost:3000/customers?_=1366372168315&feed_page=1&tags_page=2 nadal działa