让will_paginate使用Ajax的最好方法

时间:2009-02-19 12:41:27

标签: ruby-on-rails ajax

如果你谷歌“will_paginate”和“ajax”,最好的结果是this blog post:但是will_paginate的原作者对not use this method说(对SEO /蜘蛛不好)......

但是我无法让原作者方法起作用(他的javascript会杀死我所有的链接)。 An other gentleman提出了与mislav(最初的will_paginate作者)概念类似的方法。但我无法工作。

所以.... 使用AJAX分页的最佳方法,并保持SEO友好? (对于RAILS> 2.1)

5 个答案:

答案 0 :(得分:15)

汤姆的回答是正确的。只是为了摆动,我做了一个快速实现的原型。 {J}在启用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:

<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(带Here's a screencast),但它也可以直接使用Prototype。

答案 1 :(得分:7)

Seo友好且不引人注目的javascript齐头并进。你可以做的是以下几点。

  • 对整个网站进行编码,就好像只启用了html(包括你的分页内容)
  • 如果请求来自js
  • ,请使用respond_to并仅提供项目列表
  • 从您选择的任何库中使用onDomReady,您尝试捕获所有分页链接并添加onclick事件,该事件触发对该新视图的ajax调用并返回结果。您将该结果放入包含要分页的数据的容器中。然后onclick返回false。
  • 为了给用户提供更好的用户体验,您可以在同一个javascript方法中添加活动链接等功能。

使用这种方法,分页将适用于JS和非js,因为非js用户(包括Googlebot)将正常遍历您的分页。只有在用户启用了javascript的情况下,才会使用新结果更新包含数据的容器。

答案 2 :(得分:1)

不幸的是,我认为你不能以你想要的方式使用Ajax,并且对于分页内容仍然保持SEO友好。问题是,据我所知,Google和朋友的机器人不会使用XHR请求查看您的内容,因此他们根本看不到该内容。

也就是说,如果分页项目各有自己的静态,SEO友好页面(或者在您的网站上静态可用),内容仍然会进入他们的引擎。这是你可能想要的方式。

答案 3 :(得分:0)

有一个关于这个主题的视频直播帮助我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。 至于搜索引擎优化问题,我不太了解它,但网址http://localhost:3000/customers?_=1366372168315&feed_page=1&tags_page=2仍有效

答案 4 :(得分:0)

如果不担心蜘蛛,有一种很好的方法可以做到这一点。花了我5分钟。退房:

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

如果您收到有关缺少“历史记录”文件的错误,请安装:

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

但也要注意:

rails ajax_pagination couldn't find file 'history'