Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 让will_paginate使用Ajax的最佳方法_Ruby On Rails_Ajax - Fatal编程技术网

Ruby on rails 让will_paginate使用Ajax的最佳方法

Ruby on rails 让will_paginate使用Ajax的最佳方法,ruby-on-rails,ajax,Ruby On Rails,Ajax,如果你在谷歌上搜索“will_paginate”和“ajax”,最重要的结果是:但是will_paginate的原作者说to(对搜索引擎优化/蜘蛛程序有害) 但是我无法让原始作者的方法工作(他的javascript杀死了我所有的链接)。提出了一种类似于米斯拉夫(原著作者)概念的方法。但我也不能让它起作用 所以。。。。使用AJAX分页并保持SEO友好的最佳方法是什么?(对于RAILS>2.1)不幸的是,我认为您不能以您想要的方式使用Ajax,并且就分页内容而言,仍然保持SEO友好。问题是,据我所知

如果你在谷歌上搜索“will_paginate”和“ajax”,最重要的结果是:但是will_paginate的原作者说to(对搜索引擎优化/蜘蛛程序有害)

但是我无法让原始作者的方法工作(他的javascript杀死了我所有的链接)。提出了一种类似于米斯拉夫(原著作者)概念的方法。但我也不能让它起作用


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

不幸的是,我认为您不能以您想要的方式使用Ajax,并且就分页内容而言,仍然保持SEO友好。问题是,据我所知,Google和friends的机器人不会使用XHR请求浏览您的内容,所以他们根本看不到这些内容


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

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

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

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

汤姆的回答是正确的。仅针对shiggles,我原型化了一个快速实现。这表明在启用Javascript时(用户)使用Ajax,而在禁用Javascript时(谷歌)仍然有漂亮的URL。下面是一些代码片段,可以让您继续学习

config/routes.rb:

map.connect 'items/:page', :controller => "items", :action => "index", :page => 1
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
<h1>Listing items</h1>

<div id="items">
  <%= render :partial => "items" %>
</div>
<%= will_paginate @items %>

<table>
  <% for item in @items %>
    <tr>
      <td><%= item.id %></td>
    </tr>
  <% end %>
</table>
app/controllers/items\u controller.rb:

map.connect 'items/:page', :controller => "items", :action => "index", :page => 1
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
<h1>Listing items</h1>

<div id="items">
  <%= render :partial => "items" %>
</div>
<%= will_paginate @items %>

<table>
  <% for item in @items %>
    <tr>
      <td><%= item.id %></td>
    </tr>
  <% end %>
</table>
app/views/items/\u items.html.erb:

map.connect 'items/:page', :controller => "items", :action => "index", :page => 1
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
<h1>Listing items</h1>

<div id="items">
  <%= render :partial => "items" %>
</div>
<%= will_paginate @items %>

<table>
  <% for item in @items %>
    <tr>
      <td><%= item.id %></td>
    </tr>
  <% end %>
</table>

我的示例使用jQuery(with),但使用原型也很简单。

有一个railscasts在这个主题上帮助了我

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

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 %>')
$('div#tags_list').html(“”)
$(“#收据列表”).html(“”)
因为我的主页上有两个不同的列表

我要做的就是让will_paginate使用Ajax。
至于SEO方面的问题,我不太了解,但是URL
http://localhost:3000/customers?_=1366372168315&feed_page=1&tags_page=2
仍然有效

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

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

但也要注意:


“创建一个视图并将路线映射到它。”应该是:如果请求来自js.+1,则使用respond\u并仅提供项目列表。对于“shiggles”,您可以每天学习新的术语。哦,回答得好,伊恩,我试过实现这个代码。我有两个问题。1.map.connect'items/:page',:controller=>“items”,:action=>“index”,:page=>1向我抛出一个错误,表示“未定义的变量映射”。还有一个错误,我有一个索引视图,它呈现一个部分浏览器,然后呈现一个部分列表,该列表被包装在一个名为“updated_ics_per_table”的div中。所以我使用$(“#update_ics_per_table”.pagination a”)。它不包含在这个函数中。请在这里帮助我。@ramya:Ian的答案是针对Rails 2的,并且其中一些代码在Rails 3+中被弃用。实际上,这个问题是现在的第一个链接;