2010-01-16 29 views
57

Existe-t-il un moyen facile de créer un fichier sitemaps pour les projets Rails? En particulier pour les sites dynamiques (tels que Stack Overflow par exemple), il devrait y avoir un moyen de créer dynamiquement un fichier sitemaps. Quel est le chemin à parcourir dans Ruby et/ou Rails?Fichiers sitemap Google pour les projets Rails

Que suggéreriez-vous? Y a-t-il une bonne gemme là-bas?

+2

Merci pour votre question, je me suis intéressé aux sitemaps et a découvert beaucoup de (autres) choses pour améliorer mon site en ce qui concerne Google – Veger

Répondre

47

Ajouter cet itinéraire vers le bas de votre fichier config/routes.rb (doivent être énumérés routes plus spécifiques au-dessus):

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

Créer l'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 

— Comme vous pouvez le voir, ceci est pour un blog, donc utilise un modèle Post. Ceci est le modèle de vue HAML (app/views/plan du site/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 

Ca y est! Vous pouvez le tester en élevant http://localhost:3000/sitemap.xml (si vous utilisez Mongrel) dans un navigateur, ou peut-être en utilisant cURL.

Notez que le contrôleur utilise la méthode stale? pour émettre une réponse HTTP 304 non modifiée s'il n'y a aucun nouveau message si le sitemap a été demandé pour la dernière fois.

+0

merci! très bonne réponse! – z3cko

+0

Quelqu'un peut-il ajouter des précisions sur le sitemap nommé scope, et comment définir Last_modified au moment où Post.last a été modifié aide-t-il à vérifier la staleness? – Ben

+0

Cette approche ne fonctionne évidemment pas avec Rails 3.2. – PEF

1

This article explique comment un sitemap peut être généré.

Fondamentalement devrait devrait créer un contrôleur qui trouve toutes les pages (par exemple vos messages) et mettre dans un fichier XML. Ensuite, vous informez Google de l'emplacement du fichier XML et de la date de mise à jour de votre site Web.

Une requête simple Google rails sitemap révèle beaucoup d'autres articles expliquant fondamentalement la même chose.

6

Voici un plugin pour créer des sitemaps dans Ruby on Rails: Ruby on Rails sitemap plugin. Il prend en charge la majeure partie de la logique et de la génération du sitemap. Le plugin est de ma page d'accueil.

Exemple de configuration:

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 

Meilleures salutations, Lasse

23

maintenant pour rails3, il est préférable d'utiliser bijou sitemap_generator complet.

+0

Malheureusement, le lien que vous avez posté ne fonctionne pas. vouliez-vous dire https://github.com/adamsalter/sitemap_generator? – z3cko

+13

Utilisez https://github.com/kjvarga/sitemap_generator – Ninad

+0

Cela est utile si votre sitemap est trop volumineux. Il se divisera et compressera pour vous selon les limitations du sitemap. C'est aussi super rapide. Quand je suis passé de constructeur de xml, j'ai coupé le temps de 15 minutes à 1.5 minutes. – lulalala

10

Je vous recommande de consulter le sitemap_generator gem. Il gère tous ces problèmes pour vous ... et vraiment, qui veut se moquer de la création XML?

Voici un exemple plan du site pour montrer comment vous utilisez vos modèles Rails et aides de chemin pour générer vos URL de sitemap:

# 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 

Ensuite, vous utilisez des tâches de râteau pour rafraîchir aussi souvent que vous le souhaitez. C'est vraiment si simple :)

+0

Merci pour le conseil, cette gemme rend vraiment facile de créer le sitemap, y compris le ping de tous les principaux moteurs de recherche. – anka

19

J'adore la réponse de John Topley parce qu'elle est si simple et élégante, sans avoir besoin d'un bijou. Mais il est un peu daté, j'ai donc mis à jour sa réponse pour Rails 4 et les dernières lignes directrices de Google Webmaster Tools.

config/routes.rb:

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

app/controllers/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 

app/views/plan du site/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 

Vous pouvez le tester en affichant localhost: 3000/sitemap.xml.

+1

Pour ceux qui reçoivent l'erreur ActionView :: MissingTemplate', ajoutez simplement 'gem 'haml-rails' à votre gemfile et lancez' bundle install'. – Kasperi

+0

Ma question peut sembler très simple mais je n'ai pas de modèle Post ... Qu'est-ce que c'est? – Chleo

+0

Nous utilisions simplement Post comme exemple de modèle. Vous pouvez nommer le vôtre comme vous voulez. :-) –