Xây dựng tính năng RSS trong Ruby on Rails

1. Mở đầu

Một website muốn nhanh chóng lên được top kết quả tìm kiếm của Google với các từ khóa liên quan thì đòi hỏi nội dung website luôn được cập nhật tươi mới, bài viết được update liên tục để các bộ máy tìm kiếm đánh giá tốt về website của bạn. Một website không cập nhật tin tức thường xuyên, đều đặn thì sẽ nhanh chóng bị tụt hạng trong bảng kết quả tìm kiếm. Bởi vì khi mà các website đối thủ luôn cập nhật tin tức thường xuyên mà website của bạn lại không cập nhật thì rõ ràng là bạn đã giành ít sự quan tâm cho nó, vậy thì làm sao mà các công cụ tìm kiếm đánh giá cao websie của bạn khi nội dung chậm cập nhật, lượng traffic ngày càng giảm.

Cho nên trong chiến dịch đưa website lên top thì cập nhật nội dung là công việc hàng đầu. Nhưng không phải ai cũng có đủ thời gian đê ngồi viết bài hàng ngày, hoặc có kinh phí thuê người viết bài cho website. Nếu website của bạn SEO nhiều từ khóa thì không thể nào một mình bạn có thể ngồi cả ngày cập nhật bài viết hoặc thuê người viết được. Cho nên RSS Feeds là một lựa chọn tối ưu.

2. Thuật ngữ RSS Feeds.

Rss feeds là một công nghệ internet giúp người đọc có thể đọc được những tin tức mới nhất từ một hoặc nhiều website khác nhau mà không cần trực tiếp vào website đó. Thứ họ cần là chương trình đọc tin RSS (RSS feeds reader, News reader, News aggregator).

3. Những lợi ích của RSS cho website

RSS là từ viết tắt của Really Simple Syndication : Dịch vụ cung cấp tin tức đơn giản. Và trong một file RSS sẽ có danh sách các đối tượng, mẫu tin, câu chuyện bao gồm:

  • Tiêu đề
  • Nội dung tóm tắt
  • Đường dẫn đến bài viết đó
  • Ngày tháng, tác giả…

Và những lợi ích nó mang lại như sau:

  • Nội dung luôn được cập nhật mới
  • Nếu bạn tạo ra RSS thì lúc có người lấy RSS từ website của bạn thì bạn đã có một luồng backlink miễn phí
  • Nếu bạn lấy RSS từ website khác thì nội dụng website của bạn sẽ phong phú và tăng lượng traffic
  • Tăng số từ khóa website bạn
  • Tăng tốc độ website bạn được lập chỉ mục…

4. Xây dựng tính năng RSS trong Rails

Xây dựng Rss trong Ruby on rails rất dễ ràng, nó gần như được dựng sẵn, chúng ta sẽ sử dụng trình xử lý XML Builder đi kèm với Rails. Cách hoạt động thì đơn giản là website sẽ tạo ra một file có định dạng XML rồi trả về cho người dùng, người dùng sẽ dùng một phần mềm để đọc file đó. RSS cũng có nhiều phiên bản khác nhau, phổ biến nhất là RSS 1.0, RSS 2.0 và Atom. Riêng Ruby có thư viện hỗ trợ tạo file RSS ở 3 phiên bản trên và các phiên bản khác nhỏ lẻ khác. Rails cũng có hàm tạo RSS dựa trên thư viện của Ruby, và mặc định Rails chọn phiên bản Atom. Sau đây tôi sẽ tạo một file Atom hiển thị những đơn hàng đã mua sản phẩm có id bất kỳ.

Định nghĩa Action

Đầu tiên chúng ta định nghĩa phương thức who_boughttrong lớp ProductsController như sau:

app/controllers/products_controller.rb

class ProductsController < ApplicationController
    .
    .
    .
    def who_bought
        @product = Product.find(params[:id]) 
        respond_to do |format|
            format.atom
            format.xml { render :xml => @product }
        end
    end
    .
    .
    .
end

Ở đây chúng ta lấy đối tượng Product có id tương ứng trong tham số gửi lên. Sau đó gọi hàm format.atom, hàm này sẽ chạy đoạn code có trong file <tên_phương_thức>.atom.builder nằm trong thư mục app/views/<tên model> dùng để tạo dữ liệu Atom, tức là ở đây sẽ gọi tới file feed.atom.builder trong thư mục app/views/products. Chúng ta truyền vào file này biến @product đã tạo ra ở trên trong phương thức format.xml

Tạo dữ liệu Atom

Tiếp theo chúng ta tạo filewho_bought.atom.builder trong thư mục app/views/products có nội dung như sau:

app/views/products/who_bought.atom.builder

atom_feed do |feed|
    feed.title "Feed #{@product.title}"
  
    latest_order = @product.orders.sort_by(&:updated_at).last
    feed.updated(latest_order && latest_order.updated_at)
  
    @product.orders.each do |order|
        feed.entry(order) do |entry|
            entry.title "Order #{order.id}"
            entry.summary :type => 'xhtml' do |xhtml|
                xhtml.p "Shipped to #{order.address}"
  
                xhtml.table do
                    xhtml.tr do
                        xhtml.th 'Product'
                        xhtml.th 'Quantity'
                        xhtml.th 'Total Price'
                    end
  
                    order.line_items.each do |item|
                        xhtml.tr do
                            xhtml.td item.product.title
                            xhtml.td item.quantity
                            xhtml.td number_to_currency item.total_price
                        end
                    end
  
                    xhtml.tr do
                        xhtml.th 'Total', :colspan => 2
                        xhtml.th number_to_currency order.line_items.map(&:total_price).sum
                    end
                end
                xhtml.p "Paid by #{order.pay_type}"
            end
     
            entry.author do |author|
                entry.name order.name
                entry.email order.email
            end
        end
    end
end

Hàm atom_feed ở trên là hàm helper tạo ra code XML theo định dạng Atom. Đầu tiên chúng ta gọi phương thức title và updated để thiết lập tiêu đề và thời gian tạo gần đây nhất bằng cách lấy thời gian trong thuộc tính updated_at của bản ghi Order cuối cùng. Nếu không tìm thấy thì Rails sẽ lấy thời gian là giờ hiện tại trên máy. Hai phương thức này sẽ tạo thẻ <entry><title> trong file Atom.

@product.orders.each do |order|
    feed.entry(order) do |entry|
    ...
    end
end

Tiếp theo chúng ta lặp từng bản ghi Order, cứ mỗi lần lặp thì chúng ta gọi phương thức feed.entry. Phương thức này nhận vào một đối tượng bất kỳ và tạo ra biến ActionView::Helpers::AtomFeedHelper::AtomBuilder, ở đây là biến entry.

Routing

Cuối cùng chúng ta điều hướng URL tới phương thức who_bought. Thêm đoạn code này vào trong file config/routes.rb

resources :products do
   get :who_bought, :on => :member
end

Vậy là xong, bạn có thể chạy server /products/1/who_bought.atom là sẽ có đoạn code XML hiển thị danh sách các đơn hàng có sản phẩm có product_id là 1.

5. Kết luận.

Trên đây mình đã điểm qua một chút về khái nhiệm cũng như nêu lên cách xây dựng tính năng RSS trong Ruby on rails. Hy vọng các bạn có thể tìm thấy những điều bổ ích trong đó. Thời gian mình tìm hiểu về RSS là chưa nhiều, nên chắc chắn còn nhiều thiếu sót, mình rất mong nhận được sự góp ý của các bạn.

Tài liệu tham khảo

http://www.rubyflow.com/p/lxp5nk-build-a-rss-feed-in-ruby-on-rails http://www.lugolabs.com/articles/80-build-a-rss-feed-in-ruby-on-rails