ruby on rails - rails - La mejor forma de obtener will_paginate trabajando con Ajax
rails-ujs (5)
Desafortunadamente, no creo que puedas usar Ajax de la manera que quieras y seguir siendo amigable con SEO en lo que respecta al contenido paginado. El problema es que los robots de Google y amigos, hasta donde yo sé, no pasarán por su contenido utilizando solicitudes XHR para que simplemente no vean ese contenido.
Dicho esto, si los artículos paginados tienen cada uno sus propias páginas estáticas y optimizadas para el SEO (o están estáticamente disponibles en su sitio), el contenido todavía encontrará su camino en sus motores. Esta es la forma en que probablemente querrás ir.
Si googleas "will_paginate" y "ajax", el resultado principal es esta publicación en el blog : Pero el autor original de will_paginate dice que no use este método (malo para SEO / arañas) ...
Pero no puedo hacer funcionar el método original de los autores (su javascript mata a todos mis enlaces). Otro caballero sugiere un método similar al concepto de mislav (el autor original de la paginación). Pero tampoco puedo hacerlo funcionar.
así que ... ¿cuál es la mejor manera de paginar usando AJAX y mantenerse amigable con el SEO? (para RAILS> 2.1)
La respuesta de Tomh es correcta. Solo por shiggles, prototipé una implementación rápida. Aquí hay un screencast que muestra que usa Ajax cuando JavaScript está habilitado (sus usuarios) y aún tiene URL bonitas cuando Javascript está desactivado (Google). Y aquí hay algunos fragmentos de código para que puedas seguir avanzando.
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>
diseño:
<%= 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;
});
}
Mi ejemplo usa jQuery (con jRails ), pero también es sencillo de hacer con Prototype.
Seo amigable y discreto javascript va de la mano. Lo que puedes hacer es lo siguiente.
- Codifique todo el sitio como si solo html estuviera habilitado (incluido su elemento de paginación)
- Use respond_to y solo sirva la lista de elementos si la solicitud proviene de js
- Utilizando onDomReady desde cualquier biblioteca que elijas, intentas capturar todos los enlaces de paginación y agregar un evento onclick que activa una llamada ajax a esa nueva vista y devuelve el resultado. Coloca ese resultado en el contenedor que contiene los datos que está paginating. El onclick luego devuelve falso.
- Para dar a sus usuarios una mejor experiencia de usuario, puede agregar algunas características como enlaces activos, etc. al mismo método de JavaScript.
Al utilizar este enfoque, la paginación funcionará para JS y no js ya que los usuarios que no son js (incluido el robot de Google) recorrerán su paginación de forma normal. Solo en el caso de que el usuario tenga javascript habilitado, el contenedor con datos se actualizará con nuevos resultados.
Hay un tema sobre este tema que me ayudó a salir http://railscasts.com/episodes/174-pagination-with-ajax
Estoy ejecutando Rails 3.2, así que agregué el archivo pagination.js allí mencionado a la carpeta app / assets / javascripts
pagination.js
$(function() {
$(".pagination a").live("click", function() {
$(".pagination").html("Loading...");
$.getScript(this.href);
return false;
});
});
Y luego creado
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 %>'')
Como tengo dos listados distintos en mi página de inicio.
Esto es todo lo que tuve que hacer para poner a will_paginate trabajando con Ajax. En cuanto a las preocupaciones de SEO, bueno, no sé mucho al respecto, pero la URL http://localhost:3000/customers?_=1366372168315&feed_page=1&tags_page=2
todavía funciona
Hay una gran manera de hacerlo fácilmente si no te preocupan las arañas. Me llevó 5 minutos. Revisa:
https://github.com/ronalchn/ajax_pagination/wiki/Adding-AJAX-to-will_paginate
Si obtiene un error sobre la falta de un archivo ''historial'', instale:
https://github.com/wweidendorf/jquery-historyjs
pero también ten en cuenta:
rails ajax_pagination no pudo encontrar el archivo ''history''