让will_paginate使用Ajax的最佳方法
如果你谷歌“will_paginate”和“ajax”,最好的结果是这篇博文 :但是will_paginate的原作者说不使用这种方法 (对SEO /蜘蛛不好)……
但是我无法让原作者方法起作用(他的javascript会杀死我所有的链接)。 另一位绅士建议采用与mislav(原始的will_paginate作者)概念类似的方法。 但我也无法让它工作。
所以….使用AJAX分页的最佳方法是什么,并保持SEO友好? (对于RAILS> 2.1)
汤姆的回答是正确的。 只是为了摆动,我做了一个快速实现的原型。 这是一个截屏video ,在启用Javascript(您的用户)时使用Ajax显示它,并且在禁用Javascript时仍然使用漂亮的URL(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:
Listing items
<%= render :partial => "items" %>
app/views/items/_items.html.erb:
<%= will_paginate @items %> <% for item in @items %> <%= item.id %> <% end %>
布局:
<%= 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。
Seo友好且不引人注目的javascript齐头并进。 你能做的是以下几点。
- 对整个网站进行编码,好像只启用了html(包括你的分页内容)
- 如果请求来自js,请使用respond_to并仅提供项目列表
- 从您选择的任何库中使用onDomReady,您尝试捕获所有分页链接并添加onclick事件,该事件触发对该新视图的ajax调用并返回结果。 您将该结果放入包含要分页的数据的容器中。 然后onclick返回false。
- 为了给用户提供更好的用户体验,您可以在同一个javascript方法中添加一些function,如活动链接等。
使用这种方法,分页将适用于JS和非js,因为非js用户(包括Googlebot)将正常遍历您的分页。 只有在用户启用了javascript的情况下,才会使用新结果更新包含数据的容器。
不幸的是,我认为你不能以你想要的方式使用Ajax,并且对于分页内容仍然保持SEO友好。 问题是,据我所知,Google和朋友的机器人不会使用XHR请求查看您的内容,因此他们根本看不到该内容。
也就是说,如果分页项目各有自己的静态,SEO友好页面(或在您的网站上静态可用),内容仍将进入他们的引擎。 这是你可能想要的方式。
有一个关于这个主题的轨道广播帮助我了解http://railscasts.com/episodes/174-pagination-with-ajax
我正在运行rails 3.2,所以我在app / assets / javascripts文件夹中添加了提到的pagination.js
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
仍然有效
如果不担心蜘蛛,有一种很好的方法可以很容易地做到这一点。 花了我5分钟。 查看:
https://github.com/ronalchn/ajax_pagination/wiki/Adding-AJAX-to-will_paginate
如果您收到有关缺少“历史记录”文件的错误,请安装:
https://github.com/wweidendorf/jquery-historyjs
但也要注意:
rails ajax_pagination无法找到文件’history’