-
-
Save mediasota/3e62a2954798b43a0850 to your computer and use it in GitHub Desktop.
sitemap.xml for Rails 4 application
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Generate sitemap.xml in Rails app | |
This post shows how to make sitemap.xml for your web site. | |
The sitemap will be accessible by URL http://mysite.com/sitemap.xml | |
# Routes | |
```ruby | |
Myrails::Application.routes.draw do | |
get "/sitemap.xml" => "sitemap#index", :format => "xml", :as => :sitemap | |
end | |
``` | |
# Controller | |
```ruby | |
# app/controllers/sitemap_controller.rb | |
class SitemapController < ApplicationController | |
def index | |
respond_to do |format| | |
format.xml | |
end | |
end | |
end | |
``` | |
# View | |
XML will be generated using XML builder. | |
Create a view file 'sitemap/index.xml.builder' where you can use xml builder methods. | |
```ruby | |
# app/views/sitemap/index.xml.builder | |
base_url = "http://#{request.host_with_port}/" | |
xml.instruct! :xml, :version=>"1.0" | |
xml.tag! 'urlset', 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9', 'xmlns:image' => 'http://www.google.com/schemas/sitemap-image/1.1', 'xmlns:video' => 'http://www.google.com/schemas/sitemap-video/1.1' do | |
xml.url do | |
xml.loc base_url | |
end | |
xml.url do | |
xml.loc base_url+'about.html' | |
end | |
xml.url do | |
xml.loc base_url+'contacts.html' | |
end | |
end | |
``` | |
# Generate XML dynamically | |
To do some refactoring let's prepare some data in controller for static pages and dynamic pages (like products). | |
controller: | |
```ruby | |
class SitemapController < ApplicationController | |
def index | |
@pages = ['', 'about.html', 'contacts.html'] | |
@products = Product.all | |
respond_to do |format| | |
format.xml | |
end | |
end | |
end | |
``` | |
change view: | |
```ruby | |
# app/views/index.xml.builder | |
base_url = "http://#{request.host_with_port}/" | |
xml.instruct! :xml, :version=>"1.0" | |
xml.tag! 'urlset', 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9', 'xmlns:image' => 'http://www.google.com/schemas/sitemap-image/1.1', 'xmlns:video' => 'http://www.google.com/schemas/sitemap-video/1.1' do | |
xml << (render :partial => 'sitemap/common', pages: @pages) | |
xml << (render :partial => 'sitemap/products', items: @products) | |
end | |
``` | |
and our partials: | |
```ruby | |
# app/views/sitemap/_common.xml.builder | |
base_url = "http://#{request.host_with_port}/" | |
# pages = ['about.html', 'contacts.html' ] | |
pages.each do |page| | |
xml.url do | |
xml.loc base_url+page | |
end | |
end | |
``` | |
```ruby | |
# app/views/sitemap/_products.xml.builder | |
items.each do |item| | |
xml.url do | |
xml.loc product_path(item) | |
end | |
end | |
``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment