60

有没有一种简单的方法可以为 Rails 项目创建站点地图文件?特别是对于动态站点(例如 Stack Overflow),应该有一种方法可以动态创建站点地图文件。Ruby 和/或 Rails 的方法是什么?

你有什么建议?那里有什么好的宝石吗?

4

6 回答 6

48

将此路线添加到文件底部config/routes.rb(更具体的路线应在其上方列出):

map.sitemap '/sitemap.xml', :controller => 'sitemap'

创建SitemapController(app/controllers/sitemap_controller):

class SitemapController < ApplicationController
  layout nil

  def index
    headers['Content-Type'] = 'application/xml'
    last_post = Post.last
    if stale?(:etag => last_post, :last_modified => last_post.updated_at.utc)
      respond_to do |format|
        format.xml { @posts = Post.sitemap } # sitemap is a named scope
      end
    end
  end
end

——如您所见,这是用于博客的,使用Post模型也是如此。这是HAML视图模板 (app/views/sitemap/index.xml.haml):

- base_url = "http://#{request.host_with_port}"
!!! XML
%urlset{:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9"}
  - for post in @posts
    %url
      %loc #{base_url}#{post.permalink}
      %lastmod=post.last_modified
      %changefreq monthly
      %priority 0.5

而已!您可以通过在浏览器中打开http://localhost:3000/sitemap.xml(如果使用 Mongrel)或使用 cURL 来测试它。

请注意,stale?如果自上次请求站点地图以来没有新帖子,控制器将使用该方法发出 HTTP 304 Not Modified 响应。

于 2010-01-16T14:46:51.260 回答
24

现在对于 rails3,最好使用全功能的sitemap_generator gem。

于 2010-12-22T11:51:20.517 回答
20

我喜欢约翰托普利的回答,因为它是如此简单和优雅,不需要宝石。但它有点过时了,所以我更新了他对 Rails 4 和 Google Webmaster Tools 最新站点地图指南的回答。

配置/路由.rb:

get 'sitemap.xml', :to => 'sitemap#index', :defaults => { :format => 'xml' }

应用程序/控制器/sitemap_controller.rb:

class SitemapController < ApplicationController
  layout nil

  def index
    headers['Content-Type'] = 'application/xml'
    last_post = Post.last
    if stale?(:etag => last_post, :last_modified => last_post.updated_at.utc)
      respond_to do |format|
        format.xml { @posts = Post.all }
      end
    end
  end
end

应用程序/视图/站点地图/index.xml.haml:

!!! XML
%urlset{:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9"}
  - for post in @posts
    %url
      %loc #{post_url(post)}/
      %lastmod=post.updated_at.strftime('%Y-%m-%d')
      %changefreq monthly
      %priority 0.5

您可以通过调出 localhost:3000/sitemap.xml 对其进行测试。

于 2013-10-08T04:13:06.447 回答
10

我建议您查看sitemap_generator gem。它为您处理所有这些问题……而且,真的,谁愿意在编写 XML 时搞乱?

下面是一个示例站点地图,展示了如何使用 Rails 模型和路径助手生成站点地图 URL:

# config/sitemap.rb
SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
  add '/contact_us'
  Content.find_each do |content|
    add content_path(content), :lastmod => content.updated_at
  end
end

然后,您可以根据需要使用 Rake 任务刷新。真的就是这么简单:)

于 2011-09-01T18:39:04.130 回答
6

这是一个在 Ruby on Rails 中创建站点地图的插件:Ruby on Rails 站点地图插件。它负责大部分站点地图逻辑和生成。该插件来自我的主页。

示例配置:

Sitemap::Map.draw do

  # default page size is 50.000 which is the specified maximum at http://sitemaps.org.
  per_page 10

  url root_url, :last_mod => DateTime.now, :change_freq => 'daily', :priority => 1

  new_page!

  Product.all.each do |product|
    url product_url(product), :last_mod => product.updated_at, :change_freq => 'monthly', :priority => 0.8
  end

  new_page!

  autogenerate  :products, :categories,
                :last_mod => :updated_at,
                :change_freq => 'monthly',
                :priority => 0.8

  new_page!

  autogenerate  :users,
                :last_mod => :updated_at,
                :change_freq => lambda { |user| user.very_active? ? 'weekly' : 'monthly' },
                :priority => 0.5

end

最好的问候, 拉斯

于 2010-10-29T21:54:36.120 回答
1

本文解释了如何生成站点地图。

基本上应该创建一个控制器来查找所有页面(例如您的帖子)并放入 XML 文件中。接下来,您告诉 Google XML 文件的位置以及您的网站何时更新。

一个简单的Google rails 站点地图查询揭示了许多其他解释基本相同事物的文章。

于 2010-01-16T13:34:20.413 回答