08/10/2018, 07:57

Friendly URL trong rails

Các thống kê chỉ ra rằng, mỗi khi ai đó search một từ khóa bất kì trên các công cụ tìm kiếm thì họ chỉ xem đến tối đa hết trang thứ hai, tức là khoảng 20 kết quả tìm kiếm hiển thị đầu tiên. Vì vậy, để việc tiếp thi, marketing được hiệu quả, lượng truy cập vào trang tăng lên thì việc tăng thứ hạng ...

Các thống kê chỉ ra rằng, mỗi khi ai đó search một từ khóa bất kì trên các công cụ tìm kiếm thì họ chỉ xem đến tối đa hết trang thứ hai, tức là khoảng 20 kết quả tìm kiếm hiển thị đầu tiên. Vì vậy, để việc tiếp thi, marketing được hiệu quả, lượng truy cập vào trang tăng lên thì việc tăng thứ hạng của trang web trên các công cụ tìm kiếm là một yêu cầu tất yếu. Để làm được điều này, sẽ có 2 cách:

  • Đăng kí sử dụng các dịch vụ quảng cáo Google Adwords.
  • Tối ưu hóa công cụ tìm kiếm (SEO - Search Engine Optimization)

Đối với cách đầu tiên thì trang web của bạn sẽ được lên top nhanh, tuy nhiên, bạn sẽ phải trả một chi phí tương ứng với việc lên top đó. Còn nếu muốn tự lực cánh sinh thì hãy cố gắng sử dụng cách thứ hai nhé. SEO được hiểu là phương pháp hay tập hợp những phương pháp tối ưu hóa website, làm cho website trở lên thân thiện với máy chủ tìm kiếm, nhằm nâng cao thứ hạng website của bạn trên các công cụ tìm kiếm như Google, Yahoo, Bing,… khi người dùng tìm kiếm với các keyword (từ khóa) liên quan.

Một trang web chuẩn SEO thì gồm nhiều yếu tố, ở đây mình sẽ liệt kê ra những yếu tố chính:

  • Tên miền phải liên quan đến nội dung của trang: Ví dụ như trang web của bạn để quảng cáo cho cửa hàng mua bán điện thoại thì tên miền nên có chứa "mobile", "didong" chứ đừng nên chứa mấy từ chung chung kiểu như: "cuahang", "store", ...
  • Tốc độ truy cập nhanh: Để đạt được điều này thì cần nhiều yếu tố, ví dụ như:
    • Hosting có tấc độ nhanh, bảo mật tốt, và độ ổn định cao
    • Kích thước hình ảnh trong trang nên được tối ưu hóa
    • Không nên tạo ra quá nhiều plugin
  • Tối ưu hóa URL trong trang: Khi vào các trang web chuyên nghiệp, bạn sẽ luôn nhìn thấy URL của những trang này vô cùng "easy to look", "easy to love", ví dụ như "http://vietnamnet.vn/vn/cong-nghe/bao-mat/vng-xin-loi-hua-boi-thuong-cho-nguoi-dung-zalo-bao-moi-bao-dien-tu-479488.html" hay "https://vov.vn/the-gioi/quan-sat/cuoc-doi-dau-thuong-mai-my-trung-bao-gio-dung-lai-817821.vov" đó là vì các trang này tuân thủ nghiêm túc quy tắc cách tối ưu hóa URL chuẩn SEO sau:
    • Chuyển URL từ động thành tĩnh:URL không nên để các ký tự như “?, #, =, @, %, $$” hay các kí tự có dấu trong URL (đây là lỗi rất thường gặp đối với các trang web tiếng việt)
    • Nên dùng dấu "-" để phân cách các từ trong URL: Dùng dấu “-” phân cách các từ khóa trong URL sẽ giúp các công cụ tìm kiếm dễ hiểu cấu trúc URL trong website của bạn hơn. Và việc đặt dấu gạch nối trong URL cũng giống như khi bạn đặt khoảng trống trong văn bản, sẽ giúp các từ khóa được nhận diện dễ dàng và hiển thị khi người dùng tìm kiếm một từ khóa liên quan đến nội dung trên website của bạn.
    • Nên viết thường: nghiên cứu cho thấy URL gồm toàn chữ cái viết thường đem lại hiệu quả cao hơn URL gồm cả chữ viết hoa và thường
  • Cấu trúc của trang ( các thẻ HTML như title, meta, ...)

Vậy, để xây dựng một trang web chuẩn SEO là sự kết hợp của nhiều yếu tố, bắt đầu từ việc nghiên cứu khách hàng, thói quen, cách sử dụng web đến cách viết code, chọn domain, hosting... Trong phần tiếp theo, mình sẽ giới thiệu tới các bạn các để xây dựng một rails application chuẩn SEO trên phương diện tối ưu hóa URL

Đối với những trang web thuở mới lọt lòng của chúng ta, những liên kết URL sẽ trông như thế này "http://localhost:3000/categories/1/posts/2". Một cảm giác hơi khó nhằn, cằn cỗi và khô khan. Vậy, làm thế nào để những liên kết này trông dễ đọc, "dễ mến" hơn? Sau đây, mình xin giới thiệu với mọi người kỹ thuật để có một friendly URL trong rails application

Không sử dụng gem

Trong rails, khi gọi một route, nó sẽ có dạng như thế này:

category_path(@category)

Bản chất của hàm này là nó sẽ gọi đến hàm to_params để convert object thành slug ( chỗ này mình cũng chưa biết dùng từ gì để thay thế, khi bạn search google từ khóa này thì sẽ ra mấy thứ nhầy nhụa như thế này đây

Ở đây, mình có thể diễn đạt để tạm hiểu: slug nó là một cái dính liền với object, không tách ra được, mỗi object sẽ có một slug đi kèm). Phương thức to_params của ActiveRecord mặc định đang trả ra id là slug của object, vì vậy, nếu bạn không overwrite phương thức này, mỗi khi bạn gọi kiểu như category_path(@category) nó sẽ gọi ra id của @category và thay thế vào url. Đó là lý do mà URL của bạn luôn có dạng như: categories/3.

Vậy, bản chất đã rõ, chúng ta có thể dễ dàng đạt được mong muốn hiện tại bằng cách overwrite phương thức to_params, ví dụ như sau:

def to_param
    [name.parameterize, id].join("-")
end

Rails có vẻ đã quan tâm đến việc tạo một pretty URL bằng cách tạo ra method parameterize, nếu các bạn đọc docs của method này sẽ thấy:

Replaces special characters in a string so that it may be used as part of a ‘pretty’ URL.

Test với rails c nào:

Toẹt vời.

Quay lại với vấn đề của chúng ta, kết quả trả ra sẽ ở dạng như categories/rails-3, giờ bạn đã thấy URL của mình trông friendly giống mấy trang chuyên nghiệp kia rồi đấy. Tuy nhiên, có một nhược điểm ở đây là các URL vẫn chứa id của đối tượng - thông tin không cần thiết đối với người dùng. Để bỏ được id, đơn giản, bạn chỉ cần:

def to_param
    name.parameterize
end

Khi đó, bạn sẽ có categories/rails. Một vấn đề phát sinh, đó là với RESTful của rails, nó sẽ tự động matching params[:id] = rails. Khi đó, nếu bạn viết Category.find params[:id] thì nó sẽ chạy câu truy vấn: SELECT * FROM category WHERE category.id = 'rails' => null. Các giải pháp cho trường hợp này đó là:

  • Cách 1: Viết Category.find_by_name params[:id], cơ mà thế này thì có mà ăn cả đống comment.
  • Cách 2: Overwrite hàm find của rails:
def self.find(input)
    input.to_i == 0 ? find_by_name(input) : super
end

Khi đó, hàm find vẫn đáp ứng được yêu cầu tìm được object theo id mà vẫn có thể tìm được theo name.

Sử dụng gem friendly

Rails là mã nguồn mở, có thư viện phong phú, vì vậy, hãy cố gắng lợi dụng ưu điểm này. Gem FriendlyID là một công cụ hữu ích trong trường hợp này: https://github.com/norman/friendly_id. Sử dụng gem này khá đơn giản, đầu tiên, thêm gem vào Gemfile

gem "friendly_id"

Sau đó, chạy bundle install trong command line. Tiếp theo, hãy thêm những dòng này vào trong model bạn muốn dùng, ở đây, mình sẽ thêm vào model Category:

class Category < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name
end

That's it, gem sẽ tự động sử dụng name hoặc id trong hàm find mà bạn không cần overwrite. Awsome!!!

Bài viết nêu khái quát định nghĩ của một trang web chuẩn SEO, cách xây dựng friendly URL trong rails application.

Cảm ơn bạn đã lướt đến dòng cuối này. Thanks

0