【问题标题】:Best way to get will_paginate working with Ajax让 will_paginate 与 Ajax 一起工作的最佳方式
【发布时间】:2009-02-19 12:41:27
【问题描述】:

如果你用谷歌搜索“will_paginate”和“ajax”,最上面的结果是this blog post:但是will_paginate 的原作者说not use this method(对SEO/spiders 不利)...

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

所以 .... 使用 AJAX 进行分页并保持 SEO 友好的最佳方式是什么? (对于 RAILS >2.1)

【问题讨论】:

  • 其实这个问题现在是第一个链接;

标签: ruby-on-rails ajax


【解决方案1】:

Tomh 的回答是正确的。只是为了麻烦,我制作了一个快速实现的原型。 Here's a screencast 显示它在启用 Javascript 时使用 Ajax(您的用户),并且在禁用 Javascript 时仍然具有漂亮的 URL(Google)。这里有一些代码 sn-ps 可以让你继续使用它。

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 也很简单。

【讨论】:

  • “shiggles”+1 - 你可以每天学习新的术语。哦,答案也很好
  • 嗨 Ian 我尝试实现此代码。我有 2 个问题。 1. map.connect 'items/:page', :controller => "items", :action => "index", :page => 1 给我一个错误,说“未定义的变量映射”。还有一个错误,我有一个呈现部分 _browser 的索引视图,该视图又呈现一个部分 _listing,该部分_listing 包含在名为 "updated_ics_per_table" 的 div 中。所以我正在使用 $("#update_ics_per_table".pagination a")。它没有进入这个函数。请在这里帮帮我。
  • @ramya:Ian 的回答是特定于 Rails 2 的,其中一些代码在 Rails 3+ 中已被弃用。
【解决方案2】:

Seo 友好和不显眼的 javascript 齐头并进。您可以做的如下。

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

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

【讨论】:

  • "创建一个视图并映射到它的路径。"应该是:如果请求来自 js,则使用 respond_to 并仅提供项目列表。
【解决方案3】:

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

也就是说,如果每个分页项目都有自己的静态、对 SEO 友好的页面(或者在您的网站上静态可用),则内容仍会进入其引擎。这可能是您想要的方式。

【讨论】:

    【解决方案4】:

    有一个关于这个主题的 railscasts 帮助了我http://railscasts.com/episodes/174-pagination-with-ajax

    我正在运行 rails 3.2,所以我将那里提到的 pagination.js 添加到 app/assets/javascripts 文件夹中

    分页.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&amp;feed_page=1&amp;tags_page=2 仍然有效

    【讨论】:

      【解决方案5】:

      如果不担心蜘蛛,有一个很好的方法可以轻松做到这一点。花了我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'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多