2010-01-16 29 views
57

Có cách nào dễ dàng để tạo tệp sơ đồ trang web cho các dự án Rails không? Đặc biệt là đối với các trang động (ví dụ như Stack Overflow chẳng hạn) nên có một cách để tự động tạo một tệp sơ đồ trang web. Con đường để đi trong Ruby và/hoặc Rails là gì?Các tệp sơ đồ trang web của Google cho các dự án Rails

Bạn sẽ đề xuất điều gì? Có đá quý nào tốt ngoài kia không?

+2

Cảm ơn câu hỏi của bạn, tôi đã tò mò về sơ đồ trang web và đã khám phá rất nhiều thứ khác để cải thiện trang web của tôi đối với Google – Veger

Trả lời

47

Thêm tuyến đường này về phía dưới cùng của tập tin config/routes.rb của bạn (các tuyến đường cụ thể hơn sẽ được liệt kê ở trên nó):

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

Tạo 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 

— Như bạn có thể thấy, đây là một blog, do đó, sử dụng mô hình Post. Đây là mẫu xem HAML (app/views/sitemap/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 

Vậy đó! Bạn có thể kiểm tra nó bằng cách đưa lên http://localhost:3000/sitemap.xml (nếu sử dụng Mongrel) trong trình duyệt hoặc có thể bằng cách sử dụng cURL.

Lưu ý rằng bộ điều khiển sử dụng phương thức stale? để phát hành phản hồi HTTP 304 không được sửa đổi nếu không có bài đăng mới nào có sơ đồ trang web được yêu cầu lần cuối.

+0

cảm ơn! câu trả lời chính xác! – z3cko

+0

ai đó có thể thêm làm rõ trên sơ đồ trang web có tên là phạm vi và cách thiết lập Last_modified cho đến thời điểm Post.last được sửa đổi giúp kiểm tra độ chính xác không? – Ben

+0

Cách tiếp cận này rõ ràng là không hoạt động với Rails 3.2. – PEF

1

This article giải thích cách tạo sơ đồ trang web.

Về cơ bản nên tạo bộ điều khiển tìm tất cả các trang (ví dụ: Bài đăng của bạn) và đưa vào tệp XML. Tiếp theo, bạn cho Google biết về vị trí của tệp XML và khi trang web của bạn được cập nhật.

Truy vấn đơn giản Google rails sitemap cho thấy nhiều bài viết khác giải thích về cơ bản cùng một điều.

6

Đây là một plugin để tạo sơ đồ trang web trong Ruby on Rails: Ruby on Rails sitemap plugin. Nó sẽ chăm sóc hầu hết các logic và thế hệ sơ đồ trang web. Plugin là từ trang chủ của tôi.

Ví dụ cấu hình:

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 

Trân trọng, Lasse

23

Bây giờ cho rails3, nó là tốt hơn bằng cách sử dụng đầy đủ tính năng sitemap_generator đá quý.

+0

tiếc là liên kết bạn đăng không hoạt động. ý của bạn là https://github.com/adamsalter/sitemap_generator? – z3cko

+13

Sử dụng https://github.com/kjvarga/sitemap_generator – Ninad

+0

Điều này là tốt nếu sơ đồ trang web của bạn quá lớn. Nó sẽ chia nhỏ và nén cho bạn theo các giới hạn sơ đồ trang web. Nó cũng siêu nhanh. Khi tôi chuyển từ trình xây dựng xml, tôi cắt giảm thời gian từ 15 phút xuống còn 1,5 phút. – lulalala

10

Tôi khuyên bạn nên xem sitemap_generator gem. Nó xử lý tất cả các vấn đề này cho bạn ... và thực sự, ai muốn gây rối xung quanh việc soạn thảo XML?

Dưới đây là một ví dụ sitemap để hiển thị cách bạn sử dụng mô hình Rails của bạn và những người giúp đỡ con đường để tạo URL sitemap của bạn:

# 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 

Sau đó, bạn sử dụng nhiệm vụ Rake để làm mới thường xuyên như bạn muốn. Nó thực sự là đơn giản :)

+0

Cảm ơn lời khuyên, đá quý này thực sự làm cho nó dễ dàng để tạo ra các sitemap bao gồm ping tất cả các công cụ tìm kiếm lớn. – anka

19

Tôi yêu câu trả lời của John Topley vì nó đơn giản và thanh lịch, không cần đá quý. Nhưng đó là một chút ngày, vì vậy tôi đã cập nhật câu trả lời của mình cho Rails 4 và các nguyên tắc sơ đồ trang web mới nhất của Công cụ quản trị trang web của Google.

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/sitemap/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 

Bạn có thể kiểm tra nó bằng cách đưa lên localhost: 3000/sitemap.xml.

+1

Đối với những người đang gặp lỗi 'ActionView :: MissingTemplate', chỉ cần thêm' gem 'haml-rails' vào gemfile của bạn và chạy 'bundle install'. – Kasperi

+0

Câu hỏi của tôi có vẻ rất dễ dàng nhưng tôi không có bất kỳ mẫu bài đăng nào ... nó là gì? – Chleo

+0

Chúng tôi chỉ sử dụng Post làm mẫu ví dụ. Bạn có thể đặt tên cho bất kỳ thứ gì bạn thích. :-) –

Các vấn đề liên quan