# 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 ```