2014-05-24 8 views
5

Próbuję zrobić mapę witryny dla aplikacji Ruby on Rails 4. Chciałbym użyć takiego klejnotu, jak ten dynamic_sitemaps, ale nie mogę go użyć z Heroku, więc rozejrzałem się i znalazłem ten samouczek: http://meghagulati.com/2013/12/05/sitemap-xml-on-heroku-with-ruby-on-rails/, aby utworzyć własne (z małymi zmianami) Ale otrzymuję ten błąd, gdy przejdę do myapp. com/sitemap.xml, Mam nadzieję, że ktoś może mi pomóc znaleźć błąd.Tworzenie pliku sitemap.xml za pomocą Ruby on Rails 4

ActionController::UnknownFormat in SitemapsController#index ActionController::UnknownFormat Extracted source (around line #7): respond_to do |format|

#app/controllers/sitemaps_controller.rb 
class SitemapsController < ApplicationController 
    def index 
    @static_pages = [root_url] 
    @movies = Movie.all 
    respond_to do |format| 
     format.xml 
    end 
    @series = Series.all 
    respond_to do |format| 
     format.xml 
    end 
    end 
end 

#app/views/sitemaps/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' do 
    xml.url{ 
     xml.loc("http://myapp.com") 
     xml.changefreq("weekly") 
     xml.priority(1.0) 
    } 
    xml.url{ 
     xml.loc("http://myapp.com/movies") 
     xml.changefreq("daily") 
     xml.priority(0.9) 
    } 
    xml.url{ 
     xml.loc("http://myapp.com/series") 
     xml.changefreq("daily") 
     xml.priority(0.9) 
    } 
    @movies.each do |movie| 
    xml.url { 
     xml.loc "#{movie_url(movie)}" 
     xml.lastmod movie.updated_at.strftime("%F") 
     xml.changefreq("weekly") 
     xml.priority(0.5) 
    } 
    end 
    @series.each do |series| 
    xml.url { 
     xml.loc "#{series_url(series)}" 
     xml.lastmod series.updated_at.strftime("%F") 
     xml.changefreq("weekly") 
     xml.priority(0.5) 
    } 
    end 
end 

#config/routes.rb 
resources :sitemaps, :only => :index 
get "sitemap.xml" => "sitemaps#index", format: :xml, as: :sitemap 

Odpowiedz

8

Przede wszystkim, respond_to musi być wywołana tylko raz, więc trzeba zmienić metodę kontrolera, np

class SitemapsController < ApplicationController 
    def index 
    @static_pages = [root_url] 

    @movies = Movie.all 
    @series = Series.all 

    respond_to do |format| 
     format.xml 
    end 
    end 
end 

Ta zmiana powinna zdać XML plik w przeglądarce podczas odwiedzania następującego adresu URL:

http://lvh.me:3000/sitemaps.xml

Ponadto trzeba zmienić specyfikację trasy i korzystać ciąg do zamiast formatu symbolu, czyli zmiany XML do „xml”:

get "sitemap.xml" => "sitemaps#index", :format => "xml", :as => :sitemap 

powinien pojawić się taki sam plik XML w przeglądarce odwiedzając następujący adres URL:

http://lvh.me:3000/sitemap.xml

(lvh.me postanawia localhost)