Skip to content

Instantly share code, notes, and snippets.

@mediasota
Forked from maxivak/readme.md
Created November 10, 2015 09:48
Show Gist options
  • Save mediasota/3e62a2954798b43a0850 to your computer and use it in GitHub Desktop.
Save mediasota/3e62a2954798b43a0850 to your computer and use it in GitHub Desktop.
sitemap.xml for Rails 4 application
# 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